XML到Node.js中的PEM

前端之家收集整理的这篇文章主要介绍了XML到Node.js中的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公钥PEM.我将基于Trevor关于node.js的评论,验证期望一个PEM.

函数以十六进制形式组成ASN.1 DER结构,然后对其进行十六进制解码,然后对其进行base64编码,然后将其夹在—– BEGIN PRIVATE KEY —–和—– END PRIVATE键 – – -.毕竟,这是一个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
}

二进制操作与十六进制字符串?哎,嘿,这是一个黑客.

猜你在找的XML相关文章