如何将JAVA中x509证书的公钥转换为十六进制

时间:2012-03-19 08:57:54

标签: java x509certificate

我们要求在项目中获得“x509证书的公钥”。我们使用x509Certificate.getPublicKey()API来获取byte [],然后计算它的十六进制形式。例如,在java中计算的证书的十六进制形式的公钥是

30820122300d06092a864886f70d01010105000382010f003082010a0282010100af240808297a359e600caae74b3b4edc7cbc3c451cbb2be0fe2902f95708a364851527f5f1adc831895d22e82aaaa642b38ff8b955b7b1b74bb3fe8f7e0757ecef43db66621561cf600da4d8def8e0c362083d5413eb49ca59548526e52b8f1b9febf5a191c23349d843636a524bd28fe870514dd189697bc770f6b3dc1274db7b5d4b56d396bf1577a1b0f4a225f2af1c926718e5f40604ef90b9e400e4dd3ab519ff02baf43ceee08beb378becf4d7acf2f6f03dafdd759133191d1c40cb7424192193d914feac2a52c78fd50449e48d6347883c6983cbfe47bd2b7e4fc595ae0e9dd4d143c06773e314087ee53f9f73b8330acf5d3f3487968aee53e825150203010001

但是,当我们双击证书并在详细信息选项卡中查看公钥的值时,它会跟随:

3082010a0282010100af240808297a359e600caae74b3b4edc7cbc3c451cbb2be0fe2902f95708a364851527f5f1adc831895d22e82aaaa642b38ff8b955b7b1b74bb3fe8f7e0757ecef43db66621561cf600da4d8def8e0c362083d5413eb49ca59548526e52b8f1b9febf5a191c23349d843636a524bd28fe870514dd189697bc770f6b3dc1274db7b5d4b56d396bf1577a1b0f4a225f2af1c926718e5f40604ef90b9e400e4dd3ab519ff02baf43ceee08beb378becf4d7acf2f6f03dafdd759133191d1c40cb7424192193d914feac2a52c78fd50449e48d6347883c6983cbfe47bd2b7e4fc595ae0e9dd4d143c06773e314087ee53f9f73b8330acf5d3f3487968aee53e825150203010001

我们发现JAVA api计算的值在开始时有44个字符,而从第45个字符开始,数据与windows计算的值相同。

任何正文都可以帮我确定如何计算与windows计算相同的证书的公钥。

谢谢。

1 个答案:

答案 0 :(得分:4)

在X509证书中,公钥被编码为名为SubjectPublicKeyInfo的ASN.1结构,如下所示:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
     algorithm            AlgorithmIdentifier,
     subjectPublicKey     BIT STRING  }

算法字段标识密钥的类型(RSA,DSA,Diffie Hellman ...),并且位字符串包含编码为依赖于密钥类型的结构的公钥数据。

在您的情况下,第一个字节[]包含SubjectPublicKeyInfo的所有数据,包括顶级SEQUENCE标记,长度和algorithm字段以及subjectPublicKey字段。

第二个字节[]仅包含第二个字段(即BIT STRING)。在您的示例中,这是一个RSA公钥encoded with this structure

RSAPublicKey ::= SEQUENCE {
   modulus            INTEGER,    -- n
   publicExponent     INTEGER  }  -- e