我不是一个真正的node.js开发人员,所以这很hack
..这是一个应从base64模数和指数输出RSA公钥PEM的函数。我将基于Trevor关于node.js
verify期望PEM 的评论。
此函数以十六进制组成ASN.1 DER结构,然后对其进行十六进制解码,然后对其进行base64编码,然后将其夹在
-----BEGIN PRIVATEKEY-----和之间
-----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 } // enpre ASN.1 DER length field // if <=127, short form // if >=128, long form function enpreLengthHex(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 enpred_modlen = enpreLengthHex(modlen) var enpred_explen = enpreLengthHex(explen) var enpred_pubkey = '30' + enpreLengthHex( modlen + explen + enpred_modlen.length/2 + enpred_explen.length/2 + 2 ) + '02' + enpred_modlen + modulus_hex + '02' + enpred_explen + exponent_hex; var seq2 = '30 0d ' + '06 09 2a 86 48 86 f7 0d 01 01 01' + '05 00 ' + '03' + enpreLengthHex(enpred_pubkey.length/2 + 1) + '00' + enpred_pubkey; seq2 = seq2.replace(/ /g,''); var der_hex = '30' + enpreLengthHex(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}用十六进制字符串进行二进制操作?uck ..但是嘿,这是一个hack。



