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% 的密钥)。
这是字节长度:
工作密钥:
- 模数 => 128 字节
- 指数 => 3 字节
- D => 128 字节
- P => 64 字节
- Q => 64 字节
- DP => 64 字节
- DQ => 64 字节
- 智商 => 64 字节
无效密钥:
- 模数 => 128 字节
- 指数 => 3 字节
- D => 127 字节
- P => 64 字节
- Q => 64 字节
- DP => 64 字节
- DQ => 64 字节
- 智商 => 64 字节
区别在于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 中,因此在参考源上不可用。