简体   繁体   English

如何在c sharp中解密“带有java的加密字符串”?

[英]How can I decrypt an “encrypted string with java” in c sharp?

I have a string. 我有一个字符串。 That encrypted with java. 用java加密的。 Now I have to decrypt it in c sharp. 现在我必须用c sharp解密它。

I use RSA algorithm with same public/private keys in c sharp and java. 我在c sharp和java中使用RSA算法和相同的公钥/私钥。

But in decryption with c sharp I got a "Bad Data" error. 但在使用c sharp进行解密时,我收到了“错误数据”错误。

and an important notice is that: I can decrypt this string in java! 并且一个重要的通知是:我可以在java中解密这个字符串! and I can encrypt with c sharp and decrypt with c sharp !! 我可以用c sharp加密并用c sharp解密!! But when I try to encrypt with one of them(c sharp or java) and decrypt with the other one it raise an error ! 但是当我尝试用其中一个加密(c sharp或java)并用另一个加密时它会引发错误!

this is my c sharp code : 这是我急剧的代码:

string privateKey = "<RSAKeyValue><Modulus>rFsMn+idg8jmVMk249DzJc7AFft3+/jcnYDTh9wHee3tgFu1gBRh7e+ao+MWq7NEN0N7kUHa7O4c/ND2Ahcx/h4mXD5KDoixFRBUsxYqCJVA68qYJ7vozVPMjNr4jeOo1xt+oevO5+mUWtcaib5Iw51u1Jq/6qCqLsm8Eq3cnsE=</Modulus><Exponent>AQAB</Exponent><P>5aqTyz3GH655H+vO/BzJvFzpILpxLwXZEvqp3l3NYXKqP0tdkY1g36o6M9YodI3h8ho4VFYofIqA1+V0qPkuDQ==</P><Q>wB45uljBS8Z+WGRE1cRdpZb5aKUv76uLlCp6agtPBBhjXNIQrN8MpOCTvZM2cOsuYpYhDtnwsTY9KKXdBmv6hQ==</Q><DP>KB474uzPhwk7L1BJv9BnjPfN4WGwE765xI70zVslXThidNv9ZEeF/IwHzrZCKtn99gSOgmzqdZbcGtqCHmIooQ==</DP><DQ>eLnFrvsdJJ/sP2Fq/CX0bx0rR34eXG6hPI9g84h9s+YbcnWy8t8LVASn8oYyvMydDminB20e2k1qK0PnW6S4/Q==</DQ><InverseQ>rlPpLse8LJ0KRglnu2D1xzJT90QqzS3o80P0WTpUvm95mF5d8YaVj/d9W7FBdgZ98y6Q7of+wLCmYGKLg56wYQ==</InverseQ><D>Gs8mzZDPP3p2aWXLBfCwgYcBVeoBpc318wHg5VcSSqL5uGeLedqxyOLmOOvP0PFXgQkcJWIK/aOkGqcePQECo3TNiK+uLSwc97V3spZah70FFJVyh23Y+o0wlRGHAm5Nj9QieHlVwhgJPkNUJYgH9qkwB9aCpl+rdAG3da2fQ2E=</D></RSAKeyValue>";
string publicKey = "<RSAKeyValue><Modulus>rFsMn+idg8jmVMk249DzJc7AFft3+/jcnYDTh9wHee3tgFu1gBRh7e+ao+MWq7NEN0N7kUHa7O4c/ND2Ahcx/h4mXD5KDoixFRBUsxYqCJVA68qYJ7vozVPMjNr4jeOo1xt+oevO5+mUWtcaib5Iw51u1Jq/6qCqLsm8Eq3cnsE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";



public string EncryptData(string data2Encrypt )
{
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    rsa.FromXmlString(publicKey);
    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
    byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
    return Convert.ToBase64String(cipherbytes);
}

public string DecryptData(string data2Decrypt)
{
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    rsa.FromXmlString(privateKey);
    byte[] plainbytes = rsa.Decrypt(Convert.FromBase64String(data2Decrypt), false);
    return System.Text.Encoding.UTF8.GetString(plainbytes);
}

and my java code is : 我的java代码是:

byte[] expBytes = Base64.decode("AQAB".getBytes("UTF-8"), Base64.DEFAULT);
byte[] modBytes = Base64.decode("rFsMn+idg8jmVMk249DzJc7AFft3+/jcnYDTh9wHee3tgFu1gBRh7e+ao+MWq7NEN0N7kUHa7O4c/ND2Ahcx/h4mXD5KDoixFRBUsxYqCJVA68qYJ7vozVPMjNr4jeOo1xt+oevO5+mUWtcaib5Iw51u1Jq/6qCqLsm8Eq3cnsE=".getBytes("UTF-8"), Base64.DEFAULT);
byte[] dBytes = Base64.decode("Gs8mzZDPP3p2aWXLBfCwgYcBVeoBpc318wHg5VcSSqL5uGeLedqxyOLmOOvP0PFXgQkcJWIK/aOkGqcePQECo3TNiK+uLSwc97V3spZah70FFJVyh23Y+o0wlRGHAm5Nj9QieHlVwhgJPkNUJYgH9qkwB9aCpl+rdAG3da2fQ2E=".getBytes("UTF-8"), Base64.DEFAULT);

BigInteger modules = new BigInteger(1, modBytes);
BigInteger exponent = new BigInteger(1, expBytes);
BigInteger d = new BigInteger(1, dBytes);

KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");
String input = "test";

RSAPublicKeySpec pubSpec = new RSAPublicKeySpec(modules, exponent);
PublicKey pubKey = factory.generatePublic(pubSpec);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encrypted = cipher.doFinal(input.getBytes());

String strEncrypted = Base64.encodeToString(encrypted, Base64.DEFAULT);

I can not decode strEncrypted value in c sharp. 我无法解码c sharp中的strEncrypted值。

and at the end encryption value in java is different with c sharp(same keys and algorithm and data) !!! 最后,java中的加密值与c sharp(相同的密钥,算法和数据)不同!

Second parameter of RSACryptoServiceProvider.Encrypt(plainbytes, false) means that PKCS#1 padding is used. RSACryptoServiceProvider.Encrypt(plainbytes, false)第二个参数表示使用PKCS#1填充。 true is for OAEP padding. true适用于OAEP填充。

In Java the security provider you use maps "RSA" to "RSA/ECB/NoPadding" , which is just encryption without any padding, hence an encryption result is always the same. 在Java中,您使用的安全提供程序将"RSA"映射到"RSA/ECB/NoPadding" ,这只是加密而没有任何填充,因此加密结果始终相同。 So there is a need to specify "RSA/ECB/PKCS1Padding" to match C# behavior. 因此需要指定"RSA/ECB/PKCS1Padding"以匹配C#行为。

You should always specify the mode and padding otherwise the security provider will choose it's own defaults - and the defaults may differ for each provider. 您应始终指定模式和填充,否则安全提供程序将选择它自己的默认值 - 并且每个提供程序的默认值可能不同。

I found it :) 我找到了 :)

I changed this line : 我更改了这一行:

Cipher cipher = Cipher.getInstance("RSA");

to : 至 :

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");

It worked well. 它运作良好。 But who knows what's different between these ? 但是谁知道这些之间有什么不同呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在Java中解密C#加密的AES字符串 - How to decrypt a C# encrypted AES string in java 如何解密 C# 中的加密 MCRYPT_RIJNDAEL_256 值,该值由 PHP 中的 mcrypt 加密? - How can I decrypt an encrypted MCRYPT_RIJNDAEL_256 value in C#, that was encrypted by mcrypt in PHP? 我可以使用程序集PublicKey解密用相应的PrivateKey加密的字符串吗? - Can I use the assemblies PublicKey to decrypt a string encrypted with the corresponding PrivateKey? 如何在Java中使用AES算法解密加密的字符串 - how to decrypt the encrypted string that using AES algorithm in java 在.NET中,如何解密使用Java中的PBEWithMD5AndDES加密的值? - In .NET, how can I decrypt values that were encrypted using PBEWithMD5AndDES in Java? 如何解密sha1加密字符串C# - How to decrypt sha1 encrypted string C# 如何使用Rijndael在iOS中加密c#中的解密字符串 - How decrypt string in c# was encrypted in iOS using Rijndael 如何在 C# 中解密通过 PowerShell 加密的字符串 - How to decrypt a string in C# which is encrypted via PowerShell 如何在 C# 中解密由 des.exe 加密的文件? - How can I decrypt a file in C# which has been encrypted by des.exe? 我如何使用Rijndael在以C#加密的ios中解密文件 - How can i decrypt file in ios that was encrypted in c# using Rijndael
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM