node.js - 在 node.js 中,XML到 PEM

  显示原文与译文双语对照的内容

我被加密api卡住了,因为我对密码知之甚少。 我有这个


XML:
<RSAKeyValue>
 <Modulus>1znidPBIcMcO7K/53tkTSyKqxlG5Mcws8kVtijS4tyEU4W/FEVWYpOtv+Stnb4Vt</Modulus>
 <Exponent>AQAB</Exponent>
</RSAKeyValue>

Signature:
rNbdUP-p4pEGfwQSwR6VPvAVZ-sZu-ptgw8SofYYmNTlfUB9iUbb593eCAuT5jsqDTC

Original data:
<xml>...some big xml...</xml>

我想确认签名,我该怎么做?

( 我正在使用节点 v0.10.18 )

时间: 原作者:

我不是 node.js dev这是个超级特技。 下面是一个函数,它应该输出来自Base64模数和指数的RSA公钥。 我是根据trevor关于 node.js verify的评论来做的。

这里函数以十六进制形式构成 ASN.1 DER结构,然后对它的进行hex-decodes处理,然后对它的进行 base64-encodes,然后在 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 之间。 毕竟,这就是一个 PEM 。


function rsaPublicKeyPem(modulus_b64, exponent_b64) {

 function prepadSigned(hexStr) {
 msb = hexStr[0]
 if (
 (msb>='8' && msb<='9') || 
 (msb>='a' && msb<='f') || 
 (msb>='A'&&msb<='F')) {
 return '00'+hexStr;
 } else {
 return hexStr;
 }
 }

 function toHex(number) {
 var nstr = number.toString(16)
 if (nstr.length%2==0) return nstr
 return '0'+nstr
 }

//encode ASN.1 DER length field
//if <=127, short form
//if> =128, long form
 function encodeLengthHex(n) {
 if (n<=127) return toHex(n)
 else {
 n_hex = toHex(n)
 length_of_length_byte = 128 + n_hex.length/2//0x80+numbytes
 return toHex(length_of_length_byte)+n_hex
 }
 }

 var modulus = new Buffer(modulus_b64,'base64');
 var exponent = new Buffer(exponent_b64, 'base64');

 var modulus_hex = modulus.toString('hex')
 var exponent_hex = exponent.toString('hex')

 modulus_hex = prepadSigned(modulus_hex)
 exponent_hex = prepadSigned(exponent_hex)

 var modlen = modulus_hex.length/2
 var explen = exponent_hex.length/2

 var encoded_modlen = encodeLengthHex(modlen)
 var encoded_explen = encodeLengthHex(explen)
 var encoded_pubkey = '30' + 
 encodeLengthHex(
 modlen + 
 explen + 
 encoded_modlen.length/2 + 
 encoded_explen.length/2 + 2
 ) + 
 '02' + encoded_modlen + modulus_hex +
 '02' + encoded_explen + exponent_hex;

 var seq2 = 
 '30 0d ' +
 '06 09 2a 86 48 86 f7 0d 01 01 01' +
 '05 00 ' +
 '03' + encodeLengthHex(encoded_pubkey.length/2 + 1) +
 '00' + encoded_pubkey;

 seq2 = seq2.replace(//g,'');

 var der_hex = '30' + encodeLengthHex(seq2.length/2) + seq2;

 der_hex = der_hex.replace(//g, '');

 var der = new Buffer(der_hex, 'hex');
 var der_b64 = der.toString('base64');

 var pem = '-----BEGIN PUBLIC KEY-----n' 
 + der_b64.match(/.{1,64}/g).join('n') 
 + 'n-----END PUBLIC KEY-----n';

 return pem
}

带十六进制字符串的二进制操作? Yuck 。不过这是个黑客。

原作者:
...