为什么RSA加密可以使用C#和Java返回不同的结果?

我用的是:

  • c#:RSACryptoServiceProvider
  • JAVA:KeyFactory.getInstance(“RSA”)+ Cipher

我将公钥(指数+模数)作为字节数组从java发送到c#。 没关系,有相同的字节。 但是当我尝试使用Java和c#中的一个密钥加密某些数据时 – 会有不同的结果。

Java密钥生成:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS ); m_KeyPair = keyGen.genKeyPair(); m_PublicKey = KeyFactory.getInstance("RSA").generatePublic( newX509EncodedKeySpec(m_KeyPair.getPublic().getEncoded())); byte[] exponent = m_PublicKey.getPublicExponent().toByteArray(); byte[] modulus = m_PublicKey.getModulus().toByteArray(); // then sending... 

C#Key Recieve:

 // Recieved... m_ExternKey = new RSAParameters(); m_ExternKey.Exponent = exponent; m_ExternKey.Modulus = modulus; m_RsaExtern = new RSACryptoServiceProvider(); m_RsaExtern.ImportParameters(m_ExternKey); byte[] test = m_RsaExtern.Encrypt(bytesToEncrypt, true); 

问题是加密字节是不同的。

谢谢。

RSA加密是随机的。 对于给定的公钥和给定的消息,每次加密尝试都会产生不同的字节序列。 这是正常的和预期的; 随机字节作为填充阶段的一部分被注入,而不注入随机字节将导致弱加密系统。 在解密期间,定位和删除填充字节,并且原始消息未受损害地恢复。

因此,预计您将使用Java和C#获得不同的加密消息,但是如果您运行Java或C#代码两次。

RSA Encription不能使用simular键返回不同的值 – 它的标准化算法。 检查你的钥匙。

如果我没记错的话,RSA参数包含的参数多于模数和指数。 您需要完全初始化的rsa参数才能使加密正确(在.net中)。

此外,您的私钥和私钥甚至没有在.net中设置

我希望这在C#lough代码中很有用

  byte[] rsaExp = rsaParameters.Exponent.ToByteArray(); byte[] Modulus = rsaParameters.Modulus.ToByteArray(); // Microsoft RSAParameters modulo wants leading zero's removed so create new array with leading zero's removed int Pos = 0; for (int i = 0; i < Modulus.Length; i++) { if (Modulus[i] == 0) { Pos++; } else { break; } } byte[] rsaMod = new byte[Modulus.Length - Pos]; Array.Copy(Modulus, Pos, rsaMod, 0, Modulus.Length - Pos);