2015-09-04 17 views
0

您好我目前得到的問題,我想創建一個X509證書序列號的表示,該證書完全匹配.crt文件中的十六進制表示形式。爲了得到這種感覺,我創建了一些證書和翻譯的BigInteger表示爲十六進制是這樣的:determinien前導零在序列號

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 .:我不想刪除我真正想要添加它們的前導零。

+0

我得到''8c 58 d3 ac 72 fc 2f 17 70 cd 17 a5 07 d3 f5 e5'' – agad

回答

0

.crt文件使用DER編碼進行編碼。對於INTEGER而言,必須使用二進制補碼形式,最高有效數字,最低數量的八位字節。由於您選擇的值是正值,但是以0x8c ...開頭,因此必須在前綴的前面加上一個零八位字節,以使最高位保持爲負數。

我認爲您不需要編寫代碼來測試第一位數字(在使其成爲偶數位數之後)以確定「00」必須加前綴的幫助。

產生與.crt文件完全相同的字節數時,只有在需要比較該文件的八位字節時纔有意義。但是,使用DER解碼器解碼.crt會更可靠。

+0

Thx。這有助於很多:-) – Goldfish