3

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

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

以下是字节长度:

工作键:

  • 模数 => 128 字节
  • 指数 => 3 字节
  • D => 128 字节
  • P => 64 字节
  • Q => 64 字节
  • DP => 64 字节
  • DQ => 64 字节
  • IQ => 64 字节

不工作键:

  • 模数 => 128 字节
  • 指数 => 3 字节
  • D => 127 字节
  • P => 64 字节
  • Q => 64 字节
  • DP => 64 字节
  • DQ => 64 字节
  • IQ => 64 字节

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

参数已设置,但在执行 RSA.ImportParameters(rsaParams) 时,它会引发 CryptographicException 并带有“Bad Data”消息。

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

4

1 回答 1

9

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

  • 模数:任何偶数大小,我们称之为长度n
  • 指数:(<= 4字节;虽然 RSACng 允许“任意大小”),我们称之为长度e
  • 丁:n
  • 磷:n/2
  • 问:n/2
  • DP:n/2
  • 问题:n/2
  • 逆Q:n/2

因此,假设您的第二个键实际上是 Modulus: 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提供了显示这种关系的源代码。在 .NET Framework 中,它隐藏在 CLR 中,因此在参考源中不可用。

于 2016-08-25T02:55:11.620 回答