确定序列号中的前导零

determien leading zeros in serialnumber

您好,我目前遇到的问题是,我想从 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("(?<=..)(..)", " ");
    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.: 我不想删除前导零我真的想添加它们。

.crt 文件使用 DER 编码进行编码。对于 INTEGER,必须使用二进制补码形式,首先是最高有效位,并且必须使用最少的八位字节数。由于您选择的值是正数但以 0x8c... 开头,因此必须在前面加上零八位字节以防止最高有效位成为负数。

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

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