当前位置: 首页 > news >正文

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

 

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

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

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64def 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_base64except 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加密成功的示例!

 

http://www.jsqmd.com/news/508417/

相关文章:

  • phone2qq:通过手机号快速查询QQ号的高效工具使用指南
  • 5分钟部署GLM-4.6V-Flash-WEB:单卡推理+网页界面,轻松搭建多模态应用
  • Hot100中的:图论专题
  • 解码 LNP:mRNA 药物包封工艺的创新之路
  • 新手友好:在快马平台上通过生成式ai轻松学习linux脚本编写
  • STM32F103C8T6开发板控制Shadow Sound Hunter:边缘计算实践
  • ThinkPad散热控制技术革新:TPFanCtrl2双风扇智能调节系统深度剖析
  • Bowtie2新手必看:从零开始搭建基因组比对环境(附2.5.2版本避坑指南)
  • 基于Youtu-VL-4B-Instruct-GGUF和Node.js构建AIGC内容审核微服务
  • AI编程工具90天翻倍背后:社媒运营为什么还在手动复制粘贴? - SocialEcho
  • DeepAnalyze保姆级教程:WebUI汉化配置+自定义输出模板+企业LOGO嵌入方法
  • 降AI率工具售后踩坑指南:什么情况能退款、能重处理
  • 基于Simulink的坡道扰动下重力补偿路径跟踪​
  • 伙伴系统 内核api
  • SGLang-v0.5.6模型状态持久化指南:零基础快速上手,避免重复计算
  • 2026年 辅食品牌推荐榜单:辅食面条/空心面/馄饨,果泥/有机核桃油,磨牙棒/午餐肉/鳕鱼肠/牛肉肠/肉绒,匠心营养与安心品质之选 - 品牌企业推荐师(官方)
  • Qwen3-0.6B-FP8惊艳效果:FP8格式下模型加载时间比FP16快40%
  • 2026年TikTok运营必备工具TOP8:我们测了200小时,只推荐这几个 - SocialEcho
  • 解析沙特SABER认证对厨电产品的要求
  • 告别CAD依赖:ezdxf让Python成为你的图纸处理引擎
  • 机械臂空间运动基础:从旋转矩阵到齐次变换的实践解析
  • P2872 [USACO07DEC] Building Roads S
  • 西门子博图容错组态
  • Qwen3-32B-Chat混合精度训练探索:镜像环境扩展支持小规模指令微调实操
  • AI工具让社媒运营效率暴增500%!每天8小时变2小时的秘密 - SocialEcho
  • SocialEcho 如何帮助你管理多个 X 账号 - SocialEcho
  • Nunchaku-flux-1-dev构建智能体(Agent):自主完成多轮图像修改任务
  • 从Logjam攻击到现代加密标准:解析SSL/TLS中Diffie-Hellman密钥交换的安全演进
  • Z-Image-Turbo-rinaiqiao-huiyewunv 效果深度评测:多风格人像生成作品集展示
  • Phi-4-reasoning-vision-15B在产品设计中的应用:竞品界面截图→功能拆解→体验评估