首先使用nodeRsa库来处理。
从公钥中提取modulus 和 exponent。格式跟c#代码导出来的一样
let publicKey =
'-----BEGIN PUBLIC KEY-----' +
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCF2sIZ8bqs4J8GpiB2feLaak7E' +
'LZliFCFYnTwpETfryV5PJO6NnVAx0mOcNC7OjHjVDw8VthA/dMq6KWD4V05U9XGk' +
'WniDWuGzges2isplzb6WXQ23/gkdXSlkgH05FICpvj8YtxCkYnT/Q5S0ZCkBIC3V' +
'DEJpm0g11t25n1o4iQIDAQAB' +
'-----END PUBLIC KEY-----';
public static getPublickeyModulus(publicKey: string) {
const key = new NodeRSA(publicKey); // 导入公钥
key.setOptions({encryptionScheme: 'pkcs1'}) //设置公钥pkcs1
var bytes = key.keyPair.n.toBuffer() //key.keyPair中有很多属性,n和e
// key.keyPair中有很多属性,n和e 分别对应 modulus 和 exponent
// 这里生成的对应的值分别对应的c# xml 对象中的 modulus 和 exponent
var len = bytes.byteLength;
var binary = '';
for (var i = 1; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
let b_utf8 = CryptoJS.enc.Latin1.parse(binary); // acsii 值转换成base64
let s_base64 = CryptoJS.enc.Base64.stringify(b_utf8); // 值转换成base64
// c# 中的公钥可以转成xml格式,
// window atob() //ASCII to Base64 //window.atob 和 btoa 怕不稳定,暂用上面的方法转
// window btoa() //Base64 to ASCII
// let n = window.btoa(binary);
//hdrCGfG6rOCfBqYgdn3i2mpOxC2ZYhQhWJ08KRE368leTyTujZ1QMdJjnDQuzox41Q8PFbYQP3TKuilg+FdOVPVxpFp4g1rhs4HrNorKZc2+ll0Nt/4JHV0pZIB9ORSAqb4/GLcQpGJ0/0OUtGQpASAt1QxCaZtINdbduZ9aOIk=
// AQAB
//modulus 如上例子, key。keyPair.e为65537
return {modulus: s_base64, exponent: key.keyPair.e}
}