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

use*_*509 2 c# cryptographicexception rsa private-key

我们有一个C#/ .Net 4.0应用程序,它从WebService中收到的Base64中的String中导入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.

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

bar*_*njs 7

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

  • 模数:任何均匀的大小,我们称之为长度 n
  • 指数:( <= 4字节;虽然RSACng允许"任意大小"),让我们调用长度e
  • d: n
  • 病人: n/2
  • 问: n/2
  • DP: n/2
  • DQ: n/2
  • InverseQ: n/2

因此,假设您的第二个键实际上是模数:128个字节(因为64字节P乘以64字节Q不是256个字节数),您只需要将D数组左键填充为0即可它达到了合适的长度.

byte[] newD = new byte[modulus.Length];
Buffer.BlockCopy(d, 0, newD, newD.Length - d.Length, d.Length);
Run Code Online (Sandbox Code Playgroud)

.NET Core有可用源代码显示该关系.在.NET Framework中,它隐藏在CLR中,因此在referencesource上不可用.