如何/应该使用RSA加密可变大小的数据(RSACryptoServiceProvider)

时间:2012-11-07 14:47:41

标签: c# encryption rsa public-key-encryption

在我的研究中,我发现了关于这个主题的混合信息,所以我正在寻找专业知识来解释加密可变数据量的最佳方法。

要求:

[编辑:添加额外要求#3以回应评论]

  1. 我想将RSA用于公钥/私钥加密方案 所以我可以将公钥分发给应该应用的应用程序 加密数据,但不知道如何解密它

  2. 我需要支持16个字符的数据长度(信用卡 数字)到千字节(序列化对象)及以上。大部分的     我加密的数据很小(信用卡,地址等)。

  3. 这是用于加密静态数据。

  4. 我意识到的选项:

    1. RSA-ONLY:使用RSACryptoServiceProvider使用公钥加密所有数据。 以小于密钥大小的块迭代数据 减去填充。

    2. HYBRID:使用AesCryptoServiceProvider加密数据,通话 .GenerateKey().GenerateIV()生成随机密钥和IV。 然后使用RSACryptoServiceProvider加密上面的密钥和IV 并在数据前加或附加。

    3. 在我看来,混合方法给了我两全其美的感觉。强分组密码(AES)和分布式公钥(RSA)。

      这些方法的优点和缺点是什么?标准是什么?令人惊讶的是,我没有找到很多关于这个主题的意见或信息,并且不胜感激任何您的参考。

      加成: 由于各种原因,包括公司许可限制,我正在推销我自己,但我很好奇是否有一个很好的标准开源方法C#。

2 个答案:

答案 0 :(得分:2)

在大多数情况下,RSA用于加密对称密钥(您实际上不需要加密IV,但是嘿......)

如果您使用RSA加密数据(而不是密钥),您可能会遇到在对称块密码的上下文中已知的ECB(电子代码簿模式)问题:对于给定密钥,明文始终映射到相同的密文文本...仅此一点无助于破解加密,但它可能泄漏信息,因为攻击者可以识别哪些数据包包含相同的明文

我选择混合方法,因为它适用于任意大小的数据,除非您选择ECB作为操作模式(CBC - Cypher Block Chaining模式 - 应该这样做),否则不会出现此信息泄漏/ p>

答案 1 :(得分:0)

如果您只想使用RSA存储少量数据(小于密钥中的位数),则可以使用随机数填充输入数据。 https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Padding

列出了几种填充方案