RSA加密,长度不好

JL.*_*JL. 50 c# encryption rsa encryption-asymmetric

调用以下函数时:

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
Run Code Online (Sandbox Code Playgroud)

我现在得到错误:长度不好.

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

blo*_*art 70

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

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

  • 它不仅仅是计算上的广泛性.RSA算法加密特定数字,产生另一个数字.由于算法的工作方式,该数字的最大大小.密钥越宽,它可以加密的最大数量越大.1024位密钥是128字节宽,2048位密钥是256字节.每个都可以加密一个数字,其最大宽度略小于自己的宽度.如果输入的数字太大,那么输出将与加密范围内的另一个数字相同,并且无法确定哪个是实际输入. (3认同)

Obj*_*ype 47

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

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

((KeySize - 384) / 8) + 37
Run Code Online (Sandbox Code Playgroud)

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

((KeySize - 384) / 8) + 7
Run Code Online (Sandbox Code Playgroud)

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

  • ((KeySize - 384) / 8) + 7 对我不起作用。请参阅https://crypto.stackexchange.com/questions/42097/what-is-the-maximum-size-of-the-plaintext-message-for-rsa-oaep正确的公式是:((KeySize - 384) / 8) + 6 (2认同)

And*_*yUK 17

如上所述,"坏长度"类型异常的解决方案是混合使用对称和非对称加密,以便您加密的文本大小不受密钥大小的限制.您基本上使用RSA加密来对随机密钥进行非对称加密.

对于加密:

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

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

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

用于解密:

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

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

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

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


SAM*_*SAM 5

我在对少于 200 个字符的纯文本进行 2048 RSA 加密时遇到了同样的挑战。

在我看来,我们可以在不涉及对称或非对称加密的复杂性的情况下,通过以下简单的步骤来实现目标;

通过这样做,我设法加密和解密了 40 倍大的文本

加密:

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

解密:

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

*byte[] bytes = Zip(stringToEncrypt); // Zip() 方法复制到下面

**decryptedData = 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 void CopyTo(Stream src, Stream dest)
    {
        byte[] bytes = new byte[4096];

        int cnt;

        while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
        {
            dest.Write(bytes, 0, cnt);
        }
    }
Run Code Online (Sandbox Code Playgroud)