JS实现RSA加密

发布于:2025-04-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

目标

环境

实现RSA加解密

计算RSA加密允许的最大字节长度


目标

  1. 使用JS实现RSA加密解密。
  2. 计算RSA加密允许的最大字节长度。

环境

        node-rsa


实现RSA加解密

const NodeRSA = require('node-rsa');

function getKey() {
    const keyLength=512
    // 创建 RSA 密钥对
    const key = new NodeRSA({b: keyLength}); // 512位密钥长度(你可以根据需要增加位数)
    const publicKey = key.exportKey('public');
    const privateKey = key.exportKey('private');
    return {
        "publicKey": publicKey,
        "privateKey": privateKey
    };
}

/**
 * 加密函数
 * @param plaintext 明文
 * @param publicKey 公钥
 * @returns {string|Buffer} 加密后的数据(Base64 编码)
 */
function encrypt(plaintext, publicKey) {
    const key = new NodeRSA(publicKey);
    // 使用 PKCS#1 v1.5 填充加密,并返回 Base64 编码
    return key.encrypt(plaintext, 'base64', {encryptionScheme: 'pkcs1'});
}

/**
 * 解密函数
 * @param encryptedData 密文
 * @param privateKey 私钥
 * @returns {string} 解密后的明文
 */
function decrypt(encryptedData, privateKey) {
    const key = new NodeRSA(privateKey);
    // 使用 PKCS#1 v1.5 填充解密
    return key.decrypt(encryptedData, 'utf8', {encryptionScheme: 'pkcs1'});
}

// 获取公钥和私钥
const keyObject = getKey();

// 输出公钥和私钥
console.log("公钥:\n", keyObject.publicKey);
console.log("私钥:\n", keyObject.privateKey);

// 要加密的明文
const plaintext = "hello world! 你好";

// 加密
const encryptData = encrypt(plaintext, keyObject.publicKey);
console.log("加密结果:", encryptData);

// 解密
const decryptData = decrypt(encryptData, keyObject.privateKey);
console.log("解密结果:", decryptData);

计算RSA加密允许的最大字节长度

function getMaxEncryptableBytes(keyLength, paddingType) {
    // 将密钥长度从位转换为字节,就是除以8。
    const keyLengthInBytes = keyLength >> 3;

    // 根据填充类型决定填充长度
    let paddingLength = 0;
    switch (paddingType.toUpperCase()) {
        case 'PKCS1':
            paddingLength = 11; // PKCS#1 v1.5 填充
            break;
        case 'OAEP':
            paddingLength = 42; // OAEP 填充
            break;
        case 'PSS':
            paddingLength = 42; // PSS 填充(假设)
            break;
        case 'NONE':
            paddingLength = 0;  // 无填充
            break;
        default:
            throw new Error('未知的填充类型');
    }
    // 计算最大可加密字节数
    return keyLengthInBytes - paddingLength;
}

console.log(getMaxEncryptableBytes(512,"PKCS1"))

网站公告

今日签到

点亮在社区的每一天
去签到