2012-12-27 87 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

请看看你最后的答案,我把我期待找到的输出类型。感谢您的 –