python和javascript中,关于RSA加密的相同逻辑,不同代码的对比

 

python中,相应的RSA加密代码如下:

首先的前提还是要安装好pycryptodome库

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


def pkcs1_v1_5(public_key_str: str, plain_password: str) -> str:
    """
    使用RSA公钥和PKCS1_v1_5填充方案加密明文密码

    Args:
        public_key_str: RSA公钥字符串(PEM格式)
        plain_password: 需要加密的明文密码

    Returns:
        加密后的Base64编码字符串
    """
    try:
        # 1. 加载公钥
        public_key = RSA.import_key(public_key_str)

        # 2. 创建PKCS1_v1_5加密器
        cipher = PKCS1_v1_5.new(public_key)

        # 3. 对密码进行UTF-8编码后加密(必须编码为bytes)
        # 注意:RSA加密有长度限制,一般1024位密钥最多加密117字节,2048位最多加密245字节
        password_bytes = plain_password.encode('utf-8')
        print(f"password_bytes is {password_bytes}")
        encrypted_bytes = cipher.encrypt(password_bytes)
        print(f"encrypted_bytes is {encrypted_bytes}")

        # 4. 将加密后的bytes转为Base64字符串(方便存储和传输)
        encrypted_base64 = base64.b64encode(encrypted_bytes).decode('utf-8')
        print(f"base64.b64encode is {base64.b64encode(encrypted_bytes)}")

        return encrypted_base64

    except Exception as e:
        raise Exception(f"RSA加密失败: {str(e)}")


# ------------------- 测试示例 -------------------
if __name__ == "__main__":
    # 示例公钥(PEM格式,实际使用时替换为你的公钥)
    sample_public_key = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtvTYj8PowX20g1WsX94m
2ChL8/Hxx8Ppwceqx9X18mUazN82Fvx6BKQe9haSUPXINgvdvr5CsKpyZty0TRxs
712gSaB7VXG0lOoN5JKfiDvsonIYbm1wm25U06I2rcSqj2oHtDMFbnGJuNkXZSZ6
oXPnkSHt5NjJGvUTa+oKwb6UCevlZWWLHwKvTTJTaYIdftacN3lllbqRioDpvj4i
zAcK3dpMEs5x3xIcLaaXhy5tKWi1ZM8ffdXjyHP91QthsTZJSQBq7Ck1fXQMk91L
EEN+HUWwHubm2mwN3jQ1V7YmmWPqXpxlY+AL2HWyTIMd8nAbamQ1N9W4ZbQC/HnA
jwIDAQAB
-----END PUBLIC KEY-----"""

    # 待加密的明文密码
    plain_pwd = "my_secure_password_123"

    # 执行加密
    encrypted_pwd = pkcs1_v1_5(sample_public_key, plain_pwd)

    print(f"明文密码: {plain_pwd}")
    print(f"加密后密码(Base64): {encrypted_pwd}")

注:上述代码中的公钥是使用https://www.cnblogs.com/chenlight/p/19743977中的代码产生的公钥,我在豆包和千问中寻找过好几个公钥,但是都不管用,所以就自己生成了!

意:本代码中使用的PKCS#1 v1.5(Public-Key Cryptography Standards #1, version 1.5)是RSA加密算法中一种经典的填充方案(Padding Scheme),由RSA实验室于1993年发布。它定义了如何将原始数据格式化后再进行RSA加密或签名,以确保安全性和格式统一。

代码运行结果如下:

image

 

javascript中,相应的RSA加密代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>RSA PKCS1_v1_5 加密</title>
    <!-- 方案1:使用本地的jsencrypt.min.js文件 -->
<!--    <script src="jsencrypt.min.js"></script>-->
    <!-- 方案2:更换为稳定的CDN地址也是可以的 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js"></script>
</head>
<body>
    <script>
        /**
         * 使用RSA公钥和PKCS1_v1_5填充方案加密明文密码
         * @param {string} publicKeyStr - RSA公钥字符串(PEM格式)
         * @param {string} plainPassword - 明文密码
         * @returns {string} 加密后的Base64编码字符串
         */
        function rsaEncryptWithPkcs1v15(publicKeyStr, plainPassword) {
            try {
                // 1. 创建JSEncrypt实例
                const encryptor = new JSEncrypt();
                
                // 2. 加载公钥(自动识别PEM格式)
                // 注:无返回值
                encryptor.setPublicKey(publicKeyStr);
                
                // 3. 执行加密(默认使用PKCS1_v1_5填充)
                const encrypted = encryptor.encrypt(plainPassword);
                console.log("encrypted is :",encrypted)
                
                if (!encrypted) {
                    throw new Error("加密失败,可能是公钥格式错误或明文过长");
                }
                
                return encrypted;
            } catch (e) {
                throw new Error(`RSA加密失败: ${e.message}`);
            }
        }

        // ------------------- 测试示例 -------------------
        // 替换为完整、可直接使用的测试公钥(1024位)
         const samplePublicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIVzxFpYvi/5z/w/5pbOFknh6D
W4prwian1YLwDZvfX+mBurkf1/0Nf/R9m16160XBKS1VtkEGljdshZvLR7WNowMf
S80/9BbE86xKKWMs9HykJzgoUKVO8SCkgxy+UiA8uEyef724NrTZOGk5LfHxPfqa
ksjHRN7OBDghBj5DGwIDAQAB
-----END PUBLIC KEY-----`

        // 简化测试明文(避免长度超出限制)
        const plainPwd = "12345";

        // 执行加密
        try {
            const encryptedPwd = rsaEncryptWithPkcs1v15(samplePublicKey, plainPwd);
            console.log(`明文密码: ${plainPwd}`);
            console.log(`加密后密码(Base64): ${encryptedPwd}`);
        } catch (error) {
            console.error(error.message);
        }
    </script>
</body>
</html>

注:1、方案1是本地jsencrypt库,方案2是在线的jsencrypt库,均运行成功,没有问题;

  2、代码中的公钥在使用了豆包、千问等提供的公钥后,均未加密成功,后来,上述代码中使用的是网站https://www.lddgo.net/encrypt/rsakey中生成的公钥,测试成功;

运行结果如下所示:

image

以上就是在python和javascript中,使用同一套逻辑下RSA加密成功的示例!

 

posted @ 2026-03-20 20:59  chenlight  阅读(5)  评论(0)    收藏  举报