RSA 加密返回不同的输出

Posted

技术标签:

【中文标题】RSA 加密返回不同的输出【英文标题】:RSA Encryption returning different output 【发布时间】:2013-11-16 15:31:15 【问题描述】:

我是 RSA 加密的新手,我一直在尝试使用 .Net 的 System.Security.Cryptography 了解它的工作原理。

    public String Encryption(Byte[] Input, RSAParameters PublicKey)
    
        RSAC = new RSACryptoServiceProvider();
        RSAC.ImportParameters(PublicKey);
        Byte[] Encrypt = RSAC.Encrypt(Input, false);
        return Convert.ToBase64String(Encrypt);
    

使用上面的代码,每当我重新启动应用程序时,我都会为相同的输入获得不同的加密字符串。我想知道这是否是正常行为,如果不是,如何预防。

例如,程序为输入“Hello”返回以下字符串:

NopDAF5FRu....

当我重新启动应用程序时,相同输入的输出将是:

pPPu8x6....

但是,当我为我的 RSA 加密类创建新对象时,所有对象都返回相同的输出。

【问题讨论】:

您能否展示您如何测试问题的最后一部分:“但是,当我为我的 RSA 加密类创建新对象时,所有对象都返回相同的输出。” 随机的 RSA 很好。将 false 作为第二个参数传递给 Encrypt 可能不太好,因为与 OAEP 相比,v1.5 填充有一些严重的弱点。 这能回答你的问题吗? Why is RSACryptoServiceProvider.Encrypt() output not stable? 【参考方案1】:

这是完全正常的。被加密的数据被放置在一个填充有 random 值的块中。然后使用 public 密钥对其进行加密。

查看SO Q&A了解更多详情。

【讨论】:

我想你是对的,我只是搞砸了加密中使用的密钥,因为两者都可以使用,我认为你的答案是正确的,但这里不是随机生成的私钥,因为他没有初始化它。然后模数发生变化,用(公钥)加密的文本发生变化。 使用 RSA,您可以使用 public 密钥加密,因此只有拥有 private 密钥的人才能解密它(即许多人可以拥有您的公钥并单独为您加密某些内容)。因此,公钥是上述问题中唯一需要的东西。 是的,你说得对。感谢您消除疑虑(我需要修改我的密码学)。

以上是关于RSA 加密返回不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

RSA 算法

RSA 加密 C#

openssl RSA非对称加密解密

使用相同容器的不同加密值

Python - RSA解密不返回原始消息(非常简单,短程序)

邮递员 RSA 加密