首页 > 解决方案 > 将 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 密钥时使用的默认编码格式是什么。

标签: javacryptographyrsaasn.1jce

解决方案


使用提供程序创建的 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 密钥库。


推荐阅读