将1024位RSA公钥转换为Java兼容的DER ASN.1格式及编码疑问
解答:RSA密钥转DER/ASN.1编码 & JCE默认编码格式
嘿,我来帮你理清这两个问题!
一、Java JCE生成RSA密钥的默认编码格式
当你用JCE的KeyPairGenerator生成RSA密钥对时,得到的RSAPublicKey和RSAPrivateKey实例默认采用的就是ASN.1 DER编码,具体遵循的标准是:
- 公钥:对应
SubjectPublicKeyInfo格式(定义在RFC 5280),包含算法标识和公钥核心参数(模、公钥指数)的ASN.1结构 - 私钥:对应
PrivateKeyInfo格式(定义在RFC 5958),包含算法标识和私钥完整参数(模、公钥指数、私钥指数等)的ASN.1结构
JCE的密钥实现类已经帮你封装好了这个编码逻辑,你可以直接通过API获取到DER编码的字节数据。
二、将密钥转换为DER/ASN.1编码的字节数据
其实非常简单,直接调用密钥对象的getEncoded()方法就能得到DER编码的字节数组。我把你的代码修改并补充如下:
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(); // 获取DER/ASN.1编码的公钥字节数据 byte[] publicKeyDer = serverPublicKey.getEncoded(); // 获取DER/ASN.1编码的私钥字节数据 byte[] privateKeyDer = serverPrivateKey.getEncoded(); // 这里可以对字节数组进行存储、传输等后续操作 } catch (Exception e) { e.printStackTrace(); } finally{ } }
补充说明:
getEncoded()方法返回的字节数组就是标准的DER编码格式,完全符合ASN.1规范- 如果你需要验证编码的正确性,可以用OpenSSL工具解析,比如解析公钥:
解析私钥:openssl rsa -pubin -inform der -text -noout -in public_key.deropenssl rsa -inform der -text -noout -in private_key.der
内容的提问来源于stack exchange,提问作者Kalpen Patel
相关产品推荐
相关产品推荐

