当调用以下函数时:
byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
我现在遇到了错误:bad length。
如果使用更小的字符串,它可以正常工作,有什么想法吗?我传递的字符串不到200个字符。
当调用以下函数时:
byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
我现在遇到了错误:bad length。
如果使用更小的字符串,它可以正常工作,有什么想法吗?我传递的字符串不到200个字符。
RSA加密只适用于小量数据,能够加密的数据量取决于所使用密钥的大小,例如使用1024位RSA密钥和PKCS # 1 V1.5填充,最多可以加密117个字节,而使用2048位RSA密钥,则可以加密245个字节。
这样做是有充分理由的,因为非对称加密计算成本高昂。如果您想要加密大量数据,应该使用对称加密。但是,如果您需要确保不可否认性,那么您可以同时使用两种加密方式。您可以创建一个对称密钥,并使用非对称加密来交换它,然后使用安全交换后的对称密钥来加密大量数据。这就是SSL和WS-Secure在内部使用的方法。
对于未来搜索RSA不良长度异常的情况...
您可以使用以下方法计算可以使用特定密钥大小加密的最大字节数:
((KeySize - 384) / 8) + 37
然而,如果采用了最优非对称加密填充(OAEP)参数,就像原始帖子中一样,以下内容可以用于计算最大字节数:
((KeySize - 384) / 8) + 7
合法的密钥大小为384到16384,跳过的大小为8。
加密:
生成所需长度的随机密钥,例如AES或Rijndael对称加密技术。
使用步骤1生成的随机密钥,对您的文本/数据进行AES / Rijndael对称加密。
使用RSA,非对称地加密在步骤1中生成的随机密钥。
解密:
首先使用您的私钥RSA解密AES / Rijndael生成的随机密钥。
然后使用RSA解密随机密钥,以解密原始文本/数据。
您可以查看以下C#示例进行演示:
http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/
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);
}
}