java - 将 RSA 公钥(1024 位)格式转换为 Java 的 DER ASN.1 公钥
问题描述
这是我生成 RSA 密钥的代码
public static void generateRsaKeyPair() {
try {
KeyPairGenerator keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(512);
KeyPair keyPair = keyPairGene.genKeyPair();
serverPublicKey = (RSAPublicKey) keyPair.getPublic();
serverPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
} catch (Exception e) {
e.printStackTrace();
} finally{
}
}
现在我想转换 DER/ASN.1 编码字节,还知道使用 Java JCE API 生成 RSA 密钥时使用的默认编码格式是什么。
解决方案
使用提供程序创建的 RSA 密钥对SunRsaSign
由主要由BigInteger
值组成的内部表示组成。毕竟,RSA 是一种使用整数算法的算法。在内部,它不太可能在 ASN.1 中编码,因为该算法无法使用二进制执行。您可以使用调试器浏览内部字段,但请注意,内部结构是实现细节,不应依赖。
要将公钥转换为 ASN.1,您只需调用serverPublicKey.getEncoded()
,您将获得一个 SubjectPublicKeyInfo 结构,它是为 X.509 证书定义的 ASN.1 数据结构,使用二进制 BER 编码方案进行编码(DER 是BER,通常编码与 DER 兼容)。它由一个序列组成,该序列包含一个 OID(指示 RSA 密钥类型)和 PKCS#1 编码的公钥。你可以在这里找到详细信息,当然还有结构 RSAPublicKey在这里。
您还可以调用serverPrivateKey.getEncoded()
以获取不受保护的内部 PKCS#8 结构。但是,您是否应该这样做是非常值得怀疑的。您不应分发未受保护的私钥。如果您需要存储它,请改用受保护良好的 PKCS#12 密钥库。
推荐阅读
- javascript - 如何让我的组件计算 React 中复选框值的总和?
- django - 在我将 formset 属性添加到 modelformset_factory() 之前,我的模型表单集工作正常
- r - 在 R 中为 tiff() 输出调整和选择适当大小的提示和技巧;保存时图像与文本经常不成比例
- python - 如何在 QMainWindow 中隐藏空的中央小部件
- caching - 在内存层次结构的上下文中,为什么有“写未命中策略”,而没有“读未命中策略”?
- windows - 从批处理文件启动的文件夹不是活动窗口
- bash - GitBash:无法更改目录
- python - 在python3中取消扭曲图像
- php - Vue / Laravel - 导入 CDN vuetify 而不是 npm install
- sql-server - 编写发布脚本后,SQL Server 在某些表上合并复制和垂直分区