【问题标题】:RSA with large key size Encryption具有大密钥大小的 RSA 加密
【发布时间】:2012-06-26 01:32:20
【问题描述】:

我正在尝试使用 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);
}

我做错了什么??!!

【问题讨论】:

  • 顺便说一句。你的代码太慢了。您创建 RSACryptoServiceProvider 的方式会导致创建 2560 位密钥,这非常慢(除非 .net 最近进行了延迟初始化,如单声道)。

标签: c# encryption cryptography rsa padding


【解决方案1】:

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

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

RSACryptoServiceProvider.Encrypt Method

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

【讨论】:

  • 那我该怎么办?我的模数大小是 256 字节。
  • @user1478102 取决于您的要求。我会使用混合加密。
  • 我正在重新实现几年前用 C++ 编写的现有代码。在他们使用开放 ssl 的原始代码中,使用 RSA_NO_PADDING 调用了 RSA_public_encrypt 函数,这意味着没有填充!!有没有办法绕过加密函数中的填充??
  • @user1478102 在这种情况下,您可以使用BigInteger.ModPow(message, exponent, modulus)。请注意,这至少会导致两个问题:1) 无填充 RSA 在许多情况下是不安全的 2) 如果您对私钥操作 BigInteger.ModPow(ciphertext, decryptionExponent, modulus) 执行相同操作,您将打开定时攻击。
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多