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

僤鯓⒐⒋嵵緔 提交于 2019-12-06 11:15:25

问题


We have a C#/.Net 4.0 application which imports RSA Private Keys from a String in Base64 received in a WebService.

This application works perfectly for RSA-Keys in 1024 bits, but doesn't with a special kind of rsa private keys (around 1% of keys).

Here are the byte lengths:

Working-Key:

  • Modulus => 128 Bytes
  • Exponent => 3 Bytes
  • D => 128 Bytes
  • P => 64 Bytes
  • Q => 64 Bytes
  • DP => 64 Bytes
  • DQ => 64 Bytes
  • IQ => 64 Bytes

Not-Working-Key:

  • Modulus => 128 Bytes
  • Exponent => 3 Bytes
  • D => 127 Bytes
  • P => 64 Bytes
  • Q => 64 Bytes
  • DP => 64 Bytes
  • DQ => 64 Bytes
  • IQ => 64 Bytes

The difference is in the lenght of D (128 working, 127 not working). The not-working key is 1 byte shorter than the working key.

The parameters are set but when doing RSA.ImportParameters(rsaParams) it throws a CryptographicException with a "Bad Data" Message.

What should be included to solve this problem?


回答1:


RSACryptoServiceProvider has some assumptions on the data lengths which are:

  • Modulus: any even size, let's call the length n
  • Exponent: (<= 4 bytes; though RSACng allows "any size"), let's call the length e
  • D: n
  • P: n/2
  • Q: n/2
  • DP: n/2
  • DQ: n/2
  • InverseQ: n/2

So, assuming that your second key is actually Modulus: 128 bytes (because a 64-byte P times a 64-byte Q isn't a 256 byte number), you just need to left-pad the D array with a zero to bring it up to the proper length.

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

.NET Core has the source code available showing that relationship. In .NET Framework it's buried inside the CLR, so not available on referencesource.



来源:https://stackoverflow.com/questions/39134657/cryptographicexception-in-rsa-importparameters-bad-data-in-special-1024-keys

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!