从X509证书读取RSA私钥在Windows Server2016与2019输出不同咨询
问题原因
该现象是Windows不同版本的加密模块实现差异导致的,属于正常情况,不会影响RSA运算的正确性,具体原因如下:
- RSA标准中,私钥的私有指数D只要满足
e * D ≡ 1 mod L即可正常工作,其中L的取值有两种合规的计算方式:- 基于欧拉函数φ(n)计算:φ(n) = (p-1)*(q-1)(p、q为RSA密钥的两个大素数)
- 基于Carmichael函数λ(n)计算:λ(n) = lcm(p-1, q-1),也就是p-1和q-1的最小公倍数
两种方式得到的D都是合法的,且λ(n)计算出的D值更小,运算效率更高。
- Windows Server 2016及更早版本的加密服务使用传统CAPI(Crypto API)实现,导出RSA私钥参数时采用φ(n)计算D值;Windows 10 1809版本之后、Windows Server 2019及更高版本的加密服务默认使用CNG(Cryptography Next Generation)实现,导出RSA私钥参数时采用λ(n)计算D值,因此两者输出的D属性字面量不同。
- 你调用的
GetRSAPrivateKey()方法会自适应当前系统的加密实现,在Windows Server 2016上返回的是RSACryptoServiceProvider实例,在Windows Server 2019上返回的是RSACng实例,二者导出参数的逻辑就对应了上述两种不同的D值计算规则。
验证建议
你可以通过以下方式确认两个D值均合法可用:
- 用同一公钥加密一段测试数据,分别用两台服务器导出的私钥参数初始化RSA实例进行解密,两者均可得到正确的明文
- 用两台服务器上读取到的私钥分别对同一数据做签名,用同一公钥均可完成验签
注意事项
如果你的业务逻辑中存在校验D值字面量一致性的逻辑,该逻辑不符合RSA标准规范,建议调整为基于密钥指纹(公钥的哈希值)或者证书序列号等固定属性做一致性校验。
内容的提问来源于stack exchange,提问作者IdoNotKnowEverything
相关产品推荐
相关产品推荐

