十六进制的RSA公钥转换为PEM格式

1,741 阅读1分钟
/**
 * 十六进制的RSA公钥转换为PEM格式
 * @type {module:crypto}
 */
const crypto = require('crypto');
const asn1 = require('asn1.js');

// Convert hex to buffer
function hexToBuffer(hex) {
    return Buffer.from(hex, 'hex');
}

// Convert public key from hex to PEM format
function publicKeyHexToPEM(n, e) {
    var RSAPublicKey = asn1.define('RSAPublicKey', function() {
        this.seq().obj(
            this.key('n').int(),
            this.key('e').int()
        );
    });

    var publicKey = RSAPublicKey.encode({
        n: hexToBuffer(n),
        e: parseInt(e, 16)
    }, 'der');

    var publicKeyPEM = crypto.createPublicKey({
        key: publicKey,
        format: 'der',
        type: 'pkcs1'
    });

    return publicKeyPEM.export({
        type: 'spki',
        format: 'pem'
    });
}

//传入16进制的公钥
var n = "CB99A3A4891FFECEDD94F455C5C486B936D0A37247D750D299D66A711F5F7C1EF8C17EAFD2E1552081DFFD1F78966593D81A499B802B18B0D76EF1D74F217E3FD98E8E05A906245BEDD810557DFB8F653118E59293A08C1E51DDCFA2CC13251A5BE301B080A0C93A587CB71BAED18AEF9F1E27DA6877AFED6BC5649DB12DD021";
//模数 一般默认都是10001
var e = "10001";

//复制出来的公钥值,记得删除每一行的回车
console.log(publicKeyHexToPEM(n, e));
```
```