确定序列号中的前导零

时间:2015-09-04 07:54:07

标签: java x509certificate

您好我目前遇到的问题是我想要创建一个X509证书中序列号的表示,这些证书与.crt文件中的十六进制表示完全匹配。为了感觉到这一点,我创建了许多证书,并将BigInteger表示转换为十六进制,如下所示:

public static String toHex (String number) {
    BigInteger toHex = new BigInteger(number, 10);
    String hex = toHex.toString(16);
    if (hex.trim().length()%2 == 1) {
        hex = "0" + hex;
    }
    hex = hex.replaceAll("(?<=..)(..)", " $1");
    return hex;
}

我现在的问题是这根本不起作用。我找到了至少一个代码失败的序列号表示:

BigInteger: 186553134784695772803573402931138131429
Hex from .crt: 00 8c 58 d3 ac 72 fc 2f 17 70 cd 17 a5 07 d3 f5 e5

有2个前导零,我无法弄清楚为什么以及在哪些情况下添加了这些前导零。有人能帮助我吗?

P.s。:我不想删除我真正想要添加它们的前导零。

1 个答案:

答案 0 :(得分:1)

.crt文件使用DER编码进行编码。对于INTEGER,必须使用两个补码形式,首先是最高有效数字,具有最小八位字节数。由于您选择的值为正,但以0x8c ...开头,因此必须以零八位字节作为前缀,以使最高位保持为负数。

我认为您不需要帮助编写代码来测试第一个数字(在使其成为偶数位数后)以确定必须加上“00”作为前缀。

生成与.crt文件完全相同的八位字节数只在需要比较该文件中的八位字节时才有意义。但是,使用某些DER解码器解码.crt会更可靠。