Kotlin JVM用BouncyCastle转RSA私钥为PKCS#1后还原PKCS#8不一致问题
问题根源
你写的私钥还原逻辑只提取了PKCS#1结构中的modulus(模数)和privateExponent(私钥指数)来构造RSAPrivateKeySpec,但完整的PKCS#1格式RSA私钥还包含中国剩余定理(CRT)相关的5个辅助参数:素数p、素数q、dP(d mod (p-1))、dQ(d mod (q-1))、qInv(q的模p逆元)。
只用模数和私钥指数生成私钥时,JVM的密钥工厂会基于这两个参数重新推导CRT参数,推导出来的参数编码细节和原始私钥自带的CRT参数存在差异,最终就会导致还原后的私钥PKCS#8编码和原始私钥不一致。
修复代码
把还原私钥的逻辑替换为使用RSAPrivateCrtKeySpec加载完整的PKCS#1所有参数即可:
fun privKeyFromPkcs1Bytes(privKeyPkcs1Bytes: ByteArray): PrivateKey { val rsaPrivKey: RSAPrivateKey = RSAPrivateKey.getInstance(ASN1Sequence.fromByteArray(privKeyPkcs1Bytes)) // 取出PKCS#1中全部参数构造CRT私钥规格 val privKeySpec = RSAPrivateCrtKeySpec( rsaPrivKey.modulus, rsaPrivKey.publicExponent, rsaPrivKey.privateExponent, rsaPrivKey.prime1, rsaPrivKey.prime2, rsaPrivKey.exponent1, rsaPrivKey.exponent2, rsaPrivKey.coefficient ) return KeyFactory.getInstance("RSA").generatePrivate(privKeySpec) }
修复后生成的私钥会完整保留原始PKCS#1中的所有参数,和原始私钥的PKCS#8编码会完全匹配。
内容的提问来源于stack exchange,提问作者jimmyt
相关产品推荐
相关产品推荐

