RSA.ImportParameters() 中的 CryptographicException - 特殊 1024 键中的错误数据

CryptographicException in RSA.ImportParameters() - Bad Data in special 1024 keys

我们有一个 C#/.Net 4.0 应用程序,它从 Web 服务中接收到的 Base64 字符串中导入 RSA 私钥。

此应用程序非常适合 1024 位的 RSA 密钥,但不适用于特殊类型的 rsa 私钥(大约 1% 的密钥)。

这是字节长度:

工作密钥:

无效密钥:

区别在于D的长度(128工作,127不工作)。非工作密钥比工作密钥短 1 个字节。

参数已设置,但在执行 RSA.ImportParameters(rsaParams) 时会抛出带有 "Bad Data" 消息的 CryptographicException。

解决这个问题应该包括什么?

RSACryptoServiceProvider 对数据长度有一些假设:

  • 模数:任意偶数,我们称长度为n
  • 指数:(<= 4 字节;尽管 RSACng 允许 "any size"),我们称长度为 e
  • D: n
  • P: n/2
  • 问:n/2
  • DP: n/2
  • DQ: n/2
  • 反问:n/2

因此,假设您的第二个密钥实际上是模数:128 字节(因为 64 字节的 P 乘以 64 字节的 Q 不是 256 字节的数字),您只需要向左填充 D 数组用零将其调整到适当的长度。

byte[] newD = new byte[modulus.Length];
Buffer.BlockCopy(d, 0, newD, newD.Length - d.Length, d.Length);

.NET Core 有 source code available 显示这种关系。在 .NET Framework 中,它隐藏在 CLR 中,因此在参考源上不可用。