如何在X509中编码专有的非对称公钥

时间:2014-08-19 11:53:44

标签: java encoding x509 digital-certificate jce

我正在研究Java中的加密库,它创建了自己的专有非对称密码系统(我们有充分的理由这样做太长,无法在此解释)。这种非对称密码系统是ElGamal的一种实现。该库提供了一种生成密钥对以及加密和解密数据的机制。

此密码系统的公钥和私钥当前没有实现任何接口(它们与java.security中的Key没有连接)。

但是我们现在要求我们需要在X509证书中存储ElGamal公钥。为此,我们计划在我们的专有公钥中实现java.security.PublicKey接口,因为这将允许我们将我们的专有公钥作为PublicKey传递(以允许它存储在证书中)。但是,实现PublicKey意味着我们现在必须在PublicKey中实现三个新方法,它们是:

  • public String getAlgorithm()
  • public String getFormat()
  • public byte [] getEncoded()

getEncoded()方法应返回以某种方式编码的公钥。为了与惯例保持一致,我们希望使用X509格式对数据进行编码。

我们质疑的是:如何使用这种编码格式对任意对象的上下文进行编码?

2 个答案:

答案 0 :(得分:3)

X.509指定证书的格式。公钥本身只是其中的一部分。在X.509数据结构中,它存储为位串(因此基本上是原始二进制数据)。

getEncoded方法通常返回SubjectPublicKeyInfo结构的DER编码,该结构包含编码为ASN.1对象标识符的算法和公钥本身的位。

documentation of Key提供了更多详细信息。

答案 1 :(得分:1)

Henry当然是正确的,但是使用SubjectPublicKeyInfo停止是一件非常棘手的事情,因为SubjectPublicKeyInfo只不过是一个容器的定义。

如果您使用Bouncy Castle指定的getEncoded对ElGamal公钥进行编码,那么您将获得this ASN.1 structure

SEQUENCE (2 elem)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER: 1.3.14.7.2.1.1
    SEQUENCE (2 elem)
      INTEGER (2048 bit): 3231…
      INTEGER: 2
  BIT STRING (1 elem)
    INTEGER (2048 bit): 2072…

这是一个SubjectPublicKeyInfo(第一个序列),带有一个ElGamal算法标识符(和ElGamal OID),后者又包含大素数和生成器(值为2)。然后是BIT STRING,其中包含带有公钥值的INTEGER

请注意,我发现很难找出是否在任何地方指定了上述内容。 IOW似乎是一些NIST也参与其中的研讨会。 ElGamal加密不再使用了。