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

Act*_*ioN 3 c# java rsa

我用的是:

  • 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...
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Tho*_*nin 19

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

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