用 Node 实现 Java 的 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密

node RSA RSA ECB OAEPWithSHA-256AndMGF1Padding java

JavaScript 加密现状

目前 Java 加密的类和方法都相当成熟,但 Javascript 在加密解密方面还不是很成熟,可用的库有一些,但也不全面。

node-forge 加密库

发现一个叫 node-forge 的加密库非常全面,最重要他支持我要寻找的 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密法,RSA/ECB/OAEPWithSHA-256AndMGF1Padding 是一种 RSA-OAEP 加密,并以 sha256 MGF1 sha1 进行填充的加密方法

RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密核心方法

const pki = forge.pki;
const publicKey = pki.publicKeyFromPem(publicKeyStr); // publicKeyStr 为 PEM pkcs8 格式的密钥

// java 用 'RSA/ECB/OAEPWithSHA-256AndMGF1Padding' 进行加密
const encrypted = publicKey.encrypt(buffer, 'RSA-OAEP', {
    md: forge.md.sha256.create(),
    mgf1: {
        md: forge.md.sha1.create(),
    },
});

分段加密

const MAX_ENCRYPT_BLOCK = 318; // 加密来源最大长度是 318,这取决于密钥长度的

/**
 * 获取加密参数
 * @param string
 * @returns
 */
export function encrypt(string: string) {
    const pki = forge.pki;
    const publicKey = pki.publicKeyFromPem(publicKeyStr); // publicKeyStr 为 PEM pkcs8 格式的密钥

    // 分段加密
    const bufferList: Buffer[] = getBufferList(string, MAX_ENCRYPT_BLOCK);
    const output: any[] = [];
    bufferList.forEach((item) => {
        // java 用 'RSA/ECB/OAEPWithSHA-256AndMGF1Padding' 进行加密
        const encrypted = publicKey.encrypt(item as any, 'RSA-OAEP', {
            md: forge.md.sha256.create(),
            mgf1: {
                md: forge.md.sha1.create(),
            },
        });
        // 加密出来的密文是二进制编码,不再是 utf-8
        const encryptedBuffer = Buffer.from(encrypted, 'binary');
        output.push(encryptedBuffer);
    });

    const buffer = Buffer.concat(output);
    const result = buffer.toString('base64');

    return result;
}

/**
 * 字符串切割
 * @param str
 * @param splitLength
 * @returns
 */
export function getBufferList(str: string, splitLength: number) {
    const buffer = Buffer.from(str, 'utf-8');
    const bufferList = [];
    const count = Math.ceil(buffer.length / splitLength);
    for (let i = 0; i < count; i++) {
        bufferList.push(buffer.slice(i * splitLength, (i + 1) * splitLength));
    }
    return bufferList;
}

评论

0/500

全部评论 (0)

这里没有评论,要抢沙发吗?