确定序列号中的前导零
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 会更可靠。
您好,我目前遇到的问题是,我想从 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 会更可靠。