调用以下函数时:
byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
我现在收到错误:错误的长度。
使用较小的字符串它可以工作,任何想法问题可能是我传递的字符串不到200个字符。
答案 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加密来对随机密钥进行非对称加密。
加密:
生成对称加密技术(如AES或Rijndael)所需长度的随机密钥。
使用AES / Rijndael使用步骤1中生成的随机密钥对文本/数据进行对称加密。
- 醇>
使用RSA,对步骤1中生成的随机密钥进行非对称加密。
解密:
首先使用私有RSA密钥解密AES / Rijndael生成的随机密钥。
- 醇>
然后使用RSA解密的随机密钥解密原始文本/数据
对于演示,您可能希望在C#中查看以下示例:
http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/
答案 3 :(得分:0)
在对少于200个字符的纯文本进行2048 RSA加密时,我面临着同样的挑战。
我认为,只需执行以下简单步骤,我们就可以实现目标,而无需陷入对称或非对称加密的复杂性;
这样做,我设法对40倍大的文本进行了加密和解密
加密:
解密:
使用** 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();
}
}