1

我正在尝试使用 RSACryptoServiceProvider 加密一个 256 字节的数组,但每次我都会遇到“错误长度”的异常。

byte[] seed = new byte[256];
byte[] cypherSeed = new byte[256];

RNGCryptoServiceProvider gen = new RNGCryptoServiceProvider();
gen.GetBytes(seed);

using (RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(2560))
{
   RSAParameters param = new RSAParameters();
   param.Exponent = this.exponent;
   param.Modulus = this.modulus;

   // set public keys
   rsaCryptoServiceProvider.ImportParameters(param);
   cypherSeed = rsaCryptoServiceProvider.Encrypt(seed, false);
}

我究竟做错了什么??!!

4

1 回答 1

2

你忘了考虑填充。消息大小小于密钥大小,因为 RSA 需要块的其余部分进行填充。

如果使用 PKCS#1 v1.5 填充,则需要 11 字节的填充,如果使用更强的 OAEP 填充,则需要 2*hashsize + 2 字节作为填充。

请参阅RSACryptoServiceProvider.Encrypt 方法

您还应该考虑使用混合加密,使用 RSA 加密随机密钥,并使用该密钥加密实际消息。

于 2012-06-24T14:57:32.723 回答