2012-12-27 23 views
2

您好我有一個帶有X509結構的已編碼公鑰並且我想從中提取模數和公共指數我正在使用以下ASN.1解碼器http://lapo.it/asn1js/來讀取密鑰但是我看不到結果中的模數或公開指數。在Javascript中使用X509結構讀取公共密鑰

這是我想讀的關鍵。

30819e300d06092a864886f70d010101050003818c00308188028180599a96c54ef07f5288a061a56386376fd9e2e0a253cb035f2b0c65c85c99153a848a8247d9e28d8be1dbad5e754e8393e591cc53e5abec2f0a44b4844646cc283123fdd799c50dd5acd1277fd9afeb9c5a12a53b9edfff0ac53d6e94e5f1678c3bd0ccd8d08b18d4a42f845b79b8b19203e24e189801ca396f5732bfe628edeb0203010001 

這是我從解碼器得到的結果。

SEQUENCE(2 elem) 
SEQUENCE(2 elem) 
OBJECT IDENTIFIER1.2.840.113549.1.1.1 
NULL 
BIT STRING(1 elem) 
SEQUENCE(2 elem) 
INTEGER(1023 bit) 
INTEGER65537 

在此先感謝。

//Example of what I am expecting to find. 
    30 819f // SEQUENCE 
     30 0d // SEQUENCE 
     06 09 2a864886f70d010101 // OBJECT IDENTIFIER of RSA 
     05 00 // NULL (parameter) 
     03 818d // BIT STRING 
     00 // using all following bits 
     30 8189 // SEQUENCE 
      02 8181 // (signed) INTEGER 
      00 // padding (signed INTEGER) followed by the modulus 
      95e15f182ec7b6e84786c0ee54e3bb72af0461e6fd859a3625f38dcd3fdec80d 
      fcc51a44756ec7cd6c14b430d55670460c5143efadd1ade7380e890e9957d6e6 
      b38f35412862cc955e04d1928f21c0d2f7bc48c3855276f0e7c1b45a558e3a01 
      3b969cbfaebca42b748e64bff787f86ec5f0adcd94428c4ab8ca6d2b710d785b 
      02 03 // (signed) INTEGER 
      010001 // public exponent (4th number of Fermat) 

回答

2

假設你正在使用asn1js這樣,

var hex = Hex.decode("30819e300d06..."); // key truncated for this example 

// decode key 
var mykey = ASN1.decode(hex); 

你首先需要找到模數字節開始以及模數長度現在

var modStart = mykey.sub[1].sub[0].sub[0].posContent(); 
var modLen = mykey.sub[1].sub[0].sub[0].length; 

過流環並填充modbytes陣列

// read modulus bytes 
var modbytes = []; 

for(var x = 0; x < modLen; x++) { 
    modbytes.push(mykey.stream.enc[x+modStart]); 
} 

// modbytes now contains array like [89, 154, 150, 197, 78...] 

由於指數是一個整數,它可以很容易地閱讀這樣

var exponent = mykey.sub[1].sub[0].sub[1].content(); 
// returns 65537 

您可以將值轉換爲像這樣十六進制,

// in the case of the exponent its simple 
exponent.toString(16); // returns "10001" 

至於模量,你需要遍歷模數字節並連接它們的十六進制值

var modulusHex = ""; 
for(var x = 0; x < modbytes.length; x++) { 
    var hexByte = modbytes[x].toString(16); 

    // might need padding before appending 
    modulusHex += (hexByte.length == 1) ? "0"+hexByte : hexByte; 
} 

// modulusHex now contains something like 
// 599a96c54ef07f5288a061a5... 
+0

你好,謝謝你的答案我實現你的解決方案,我得到指數66537和我得到的模數字節:89,154,150,19 7,78,240,127,82,136,160,97,165,99,134,55,111,217,226,224,162,83,203,3,95,43,12,101,200,92,153,21,58,132,138,130,71,217,226,141,139,225,219,173,94,117,78,131,147,229,145,204,83,229,171,236,47,10,68,180,132,70,70,204,40,49, 35,253,215,153,197,13,213,172,209,39,1 ...... //截斷所以這只是模數字節而不是模數本身的權利?我怎麼才能得到它?目的是重新創建公鑰。謝謝 –

+0

「模量本身」是什麼意思?你有一個你想到的輸出類型的例子嗎? – lostsource

+0

請看看你最後的答案,我把我期待找到的輸出類型。感謝您的 –