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

标签 c# java rsa

我使用:

  • 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/

相关文章:

c# - MVVM Light 和撤消/重做?

java - 如何比较Java中两个方法的复杂度?

c - 为什么不使用大于 10 位的数字?

javascript - 在 PHP 可读的 JavaScript 中创建 PEM key 对

.net-3.5 - RSACryptoServiceProvider.ImportParameters 抛出 System.Security.Cryptography.CryptographicException : Bad Data

c# - 安装其他 XLA 加载项时,VSTO 中的 Excel 加载项不起作用

c# - 如何查看IIS上的站点是否使用https证书运行

c# - 我可以检测 ios 应用程序是否从 APN 取消注册吗

java - 在 block 内定义的内部类(如 Java 中的方法)不能有任何修饰符,甚至不能有 public 修饰符。为什么?

java - 字符串无法转换为 java 错误