RSA加密,长度不好

时间:2009-09-30 08:35:30

标签: c# encryption rsa encryption-asymmetric

调用以下函数时:

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

我现在收到错误:错误的长度。

使用较小的字符串它可以工作,任何想法问题可能是我传递的字符串不到200个字符。

4 个答案:

答案 0 :(得分:67)

RSA加密仅对少量数据有意义,您可以加密的数据量取决于您使用的密钥的大小,例如1024位RSA密钥和PKCS#1 V1.5填充,你最多可以加密117个字节,使用2048个RSA密钥,你可以加密245个字节。

这是一个很好的理由,非对称加密在计算上非常昂贵。如果要加密大量数据,则应使用对称加密。但是如果你想要不可否认呢?那么你接下来要做的就是同时使用两者。您创建对称密钥并使用非对称加密进行交换,然后安全地交换对称密钥以加密大量数据。这就是SSL和WS-Secure在封面下使用的内容。

答案 1 :(得分:43)

有关RSA坏长度异常的未来搜索......

您可以使用以下内容计算可使用特定密钥大小加密的最大字节数:

((KeySize - 384) / 8) + 37

但是,如果最佳非对称加密填充(OAEP)参数为true,就像在原始帖子中一样,可以使用以下内容来计算最大字节数:

((KeySize - 384) / 8) + 7

合法密钥大小为384到16384,跳过大小为8。

答案 2 :(得分:16)

如上所述,“坏长度”类型例外的解决方案是混合使用对称和非对称加密,这样您加密的文本大小不受密钥大小的限制。您基本上使用RSA加密来对随机密钥进行非对称加密

  

加密:

     
      
  1. 生成对称加密技术(如AES或Rijndael)所需长度的随机密钥。

  2.   
  3. 使用AES / Rijndael使用步骤1中生成的随机密钥对文本/数据进行对称加密。

  4.   
  5. 使用RSA,对步骤1中生成的随机密钥进行非对称加密。

  6.         

    解密:

         
        
    1. 首先使用私有RSA密钥解密AES / Rijndael生成的随机密钥。

    2.   
    3. 然后使用RSA解密的随机密钥解密原始文本/数据

    4.   

对于演示,您可能希望在C#中查看以下示例:

http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/

答案 3 :(得分:0)

在对少于200个字符的纯文本进行2048 RSA加密时,我面临着同样的挑战。

我认为,只需执行以下简单步骤,我们就可以实现目标,而无需陷入对称或非对称加密的复杂性;

这样做,我设法对40倍大的文本进行了加密和解密

加密:

  1. 使用* Zip()方法压缩纯文本并转换为字节数组
  2. 使用RSA加密

解密:

  1. 使用RSA解密密码文本
  2. 使用** Unzip()方法解压缩解密的数据

    • byte [] bytes = Zip(stringToEncrypt); // Zip()方法复制到下面 ** unlockedData = Unzip(decryptedBytes); //复制到下面的Unzip()方法

public static byte[] Zip(string str)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(str);    
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {                        
            CopyTo(msi, gs);
        }    
        return mso.ToArray();
    }
}
public static string Unzip(byte[] bytes)
{
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(msi, CompressionMode.Decompress))
        {                     
            CopyTo(gs, mso);
        }    
        return System.Text.Encoding.UTF8.GetString(mso.ToArray());
    }
}
public static byte[] Zip(string str)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(str);    
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {
            CopyTo(msi, gs);
        }    
        return mso.ToArray();
    }
}