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

发布于 2024-08-27 16:57:10 字数 1055 浏览 3 评论 0原文

我使用:

  • 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# 密钥接收:

// 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);

问题是加密字节不同。

谢谢。

I using:

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

I sending public key (exponent + modulus) as byte array from java to c#. It's ok, there is the same bytes. But when i try to encrypt some data with one key in Java and c# - there is different results.

Java Key Generation:

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);

and problem is that encrypted bytes is different.

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清风挽心 2024-09-03 16:57:10

RSA 加密是随机的。对于给定的公钥和给定的消息,每次加密尝试都会产生不同的字节序列。这是正常现象,也是意料之中的;随机字节作为填充阶段的一部分被注入,不注入随机字节将导致加密系统较弱。在解密过程中,填充字节被定位并删除,并且原始消息被完好无损地恢复。

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

RSA encryption is randomized. For a given public key and a given message, each attempt at encryption yields a distinct sequence of bytes. This is normal and expected; random bytes are injected as part of the padding phase, and not injecting random bytes would result in a weak encryption system. During decryption, the padding bytes are located and removed, and the original message is recovered unscathed.

Hence it is expected that you will get distinct encrypted messages with Java and C#, but also if you run your Java or C# code twice.

神妖 2024-09-03 16:57:10

RSA Encription 不得使用相似密钥返回不同的值 - 它的标准化算法。检查你的钥匙。

RSA Encription mustn't return diffferent values with simular keys - its standardized algorithm. Check your keys.

北城孤痞 2024-09-03 16:57:10

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

而且,你的私钥和私钥甚至没有在.net中设置

RSA Parameters contains more parameters than modulus and exponent if i remember correctly. You need fully initialized rsa parameters to get the encryption correct (in .net).

Moreover, your private and private key is not even set in .net

人生百味 2024-09-03 16:57:10

我希望这对 C# 代码有帮助

            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);

i hope this is helpful , in C# lough code

            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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文