我使用:
- c#: RSACryptoServiceProvider
- JAVA:KeyFactory.getInstance("RSA")+密码
我将公钥(指数 + 模数)作为字节数组从 Java 发送到 C#。没关系,有相同的字节。但是当我尝试在 Java 和 C# 中使用一个 key 加密一些数据时 - 会出现不同的结果。
Java key 生成:
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 接收:
// 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 加密是随机的。对于给定的公钥和给定的消息,每次加密尝试都会产生不同的字节序列。这是正常的,也是意料之中的;随机字节作为填充阶段的一部分注入(inject),不注入(inject)随机字节会导致加密系统薄弱。在解密过程中,填充字节被找到并被移除,原始消息被毫发无损地恢复。
因此,预计您将使用 Java 和 C# 获得不同的加密消息,但如果您运行 Java 或 C# 代码两次也是如此。
关于c# - 为什么RSA加密可以用C#和Java返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568335/