基于BouncyCastle生成最小尺寸RSA密钥对及导入方法问询
提取并导出仅含核心参数的RSA密钥对
1. 从生成的密钥对中提取核心参数
默认BouncyCastle生成的AsymmetricCipherKeyPair中的私钥是RsaPrivateCrtKeyParameters类型,包含CRT加速参数。你可以直接转换类型后提取核心的N(模数)、e(公钥指数)、d(私钥指数):
// 假设res是你的AsymmetricCipherKeyPair实例 RsaPrivateCrtKeyParameters crtPrivateKey = (RsaPrivateCrtKeyParameters)res.Private; BigInteger modulus = crtPrivateKey.Modulus; BigInteger publicExponent = crtPrivateKey.PublicExponent; BigInteger privateExponent = crtPrivateKey.Exponent;
2. 创建并导出精简版私钥
使用BouncyCastle的RsaPrivateKeyParameters类创建仅包含核心参数的私钥,这个类型不会携带CRT相关字段,导出后的尺寸会显著减小:
// 创建精简私钥(仅含N和d) RsaPrivateKeyParameters minimalPrivateKey = new RsaPrivateKeyParameters(modulus, privateExponent); // 导出为DER编码的PKCS#8格式私钥 PrivateKeyInfo minimalPrivateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(minimalPrivateKey); byte[] smallPrivateKeyBytes = minimalPrivateKeyInfo.GetEncoded();
对应的公钥可以直接用RsaPublicKeyParameters创建并导出:
RsaPublicKeyParameters publicKey = new RsaPublicKeyParameters(modulus, publicExponent); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey); byte[] publicKeyBytes = publicKeyInfo.GetEncoded();
3. 重新导入精简版私钥
要将导出的字节数组恢复为可用的密钥对象,使用PrivateKeyFactory解析即可:
// 解析DER编码的私钥 PrivateKeyInfo importedPrivateKeyInfo = PrivateKeyInfo.GetInstance(Asn1Object.FromByteArray(smallPrivateKeyBytes)); AsymmetricKeyParameter importedPrivateKey = PrivateKeyFactory.CreateKey(importedPrivateKeyInfo); // 转换为RsaPrivateKeyParameters类型用于加解密/签名 RsaPrivateKeyParameters minimalImportedKey = (RsaPrivateKeyParameters)importedPrivateKey;
注意事项
- 精简版私钥因为缺少CRT参数,解密和签名操作的性能会比带CRT的私钥稍慢,但尺寸会大幅缩小,符合你存储到QR码的需求。
- 导出的字节数组是标准PKCS#8格式,兼容性良好,不需要自定义格式,后续导入也更可靠。
内容的提问来源于stack exchange,提问作者decapitation
相关产品推荐
相关产品推荐

