将RSA公钥(1024位)格式转换为Java的DER ASN.1公钥

时间:2018-05-25 13:38:06

标签: java cryptography rsa asn.1 jce

这是我生成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密钥时使用的默认编码格式是什么。

1 个答案:

答案 0 :(得分:1)

使用SunRsaSign提供程序创建的RSA密钥对由主要由BigInteger值组成的内部表示组成。 RSA毕竟是一种使用整数算法的算法。在内部,它不太可能在ASN.1中编码,因为无法使用二进制执行算法。您可以使用调试器浏览内部字段,但请注意,内部结构是一个实现细节,不应该依赖它。

要将公钥转换为ASN.1,您只需调用serverPublicKey.getEncoded()即可获得SubjectPublicKeyInfo结构,该结构是为X.509证书定义的ASN.1数据结构,使用二进制BER编码编码方案(DER是BER的子集,通常编码与DER兼容)。它由一个包含OID(表示RSA密钥类型)和PKCS#1编码公钥的序列组成。您可以在herehere中找到详细信息,当然也可以在here中构建RSAPublicKey。

您也可以调用serverPrivateKey.getEncoded()来获得一个不受保护的内部PKCS#8结构。但是,你应该这样做是非常值得怀疑的。您不应分发不受保护的私钥。如果您需要存储它,请使用受到良好保护的PKCS#12密钥存储区。