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

时间:2016-08-24 23:51:37

标签: c# rsa private-key cryptographicexception

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

此应用程序适用于1024位的RSA-Keys,但不使用特殊类型的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。

解决这个问题应包括哪些内容?

1 个答案:

答案 0 :(得分:7)

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

  • 模数:任何偶数大小,我们称之为n
  • 指数:( <= 4字节;虽然RSACng允许“任意大小”),但我们调用长度e
  • D:n
  • P:n/2
  • 问:n/2
  • DP:n/2
  • DQ:n/2
  • InverseQ: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有source code available显示该关系。在.NET Framework中,它隐藏在CLR中,因此在referencesource上不可用。