嗨,我目前遇到了一个问题,我想从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个前导零,我无法弄清楚为什么以及在哪些情况下将这些前导零相加。有人可以帮助我吗?
附注:我不想删除我要添加的前导零。
最佳答案
.crt文件使用DER编码进行编码。对于INTEGER,必须使用二进制补码形式,即最高有效位在前,位数最少的八位位组。由于您选择的值是正数,但以0x8c ...开头,因此必须在零八位字节前加上前缀,以防止将最高有效位设置为负数。
我认为您不需要帮助编写代码来测试第一个数字(在使它成为偶数个数字之后)以确定必须加“ 00”作为前缀。
仅当您需要比较该文件中的八位组时,才产生与.crt文件中完全相同的八位组数。但是,使用某些DER解码器解码.crt会更可靠。