Js RSA非对称加密
// RSA 加密
async function encryptData(publicKeyStr, data) {
const publicKey = await importPublicKey(publicKeyStr);
const encoder = new TextEncoder();
const encrypted = await window.crypto.subtle.encrypt(
{
name: "RSA-OAEP"
},
publicKey,
encoder.encode(data)
);
return arrayBufferToBase64(encrypted);
}
// RSA 解密
async function decryptData(privateKeyStr, encryptedData) {
const privateKey = await importPrivateKey(privateKeyStr);
const encryptedBuffer = base64ToArrayBuffer(encryptedData);
const decrypted = await window.crypto.subtle.decrypt(
{
name: "RSA-OAEP"
},
privateKey,
encryptedBuffer
);
const decoder = new TextDecoder();
return decoder.decode(decrypted);
}
// 导入公钥根据公钥字符串
async function importPublicKey(pemString) {
const keyData = pemToArrayBuffer(pemString);
const publicKey = await window.crypto.subtle.importKey(
"spki",
keyData,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
true, // extractable
["encrypt"]
);
return publicKey;
}
// 导入私钥根据私钥字符串
async function importPrivateKey(pemString) {
const keyData = pemToArrayBuffer(pemString);
const privateKey = await window.crypto.subtle.importKey(
"pkcs8",
keyData,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
true, // extractable
["decrypt"]
);
return privateKey;
}
// PEM 转 ArrayBuffer(清理 PEM 头尾并解码 Base64)
function pemToArrayBuffer(pem) {
const PEM_REGEX = /-----BEGIN [A-Z0-9 ]+KEY-----([^-]+)-----END [A-Z0-9 ]+KEY-----/g;
const base64Der = pem.replace(PEM_REGEX, '$1').replace(/\s/g, '');
const binaryString = atob(base64Der);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
// 格式化 PEM 字符串为每行指定长度
function formatPEM(str, chunkSize = 64) {
return str.match(new RegExp('.{1,' + chunkSize + '}', 'g')).join('\n');
}
// 将 ArrayBuffer 转换为 Base64 字符串
function arrayBufferToBase64(buffer) {
let binary = '';
const bytes = new Uint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
// 将 Base64 字符串转换为 ArrayBuffer
function base64ToArrayBuffer(base64) {
const binaryString = window.atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
console.log(" RSA Begin");
const keyPair = await generateRsaKeyPair();
console.log("GenerateRsaKey:", keyPair);
const publicKeyStr = await exportPublicKey(keyPair.publicKey);
const privateKeyStr = await exportPrivateKey(keyPair.privateKey);
console.log("PrivateKeyStr:", privateKeyStr);
console.log("PublicKeyStr:", publicKeyStr);
const testData = "Hello, World!";
console.log("Test Data:", testData);
const encryptStr = await encryptData(publicKeyStr, testData);
console.log("EncryptStr:", encryptStr);
const decryptStr = await decryptData(privateKeyStr, encryptStr);
console.log("DecryptStr:", decryptStr);
console.log(" RSA End");
注意
Node.js 不支持 window.crypto,因为 window 对象是浏览器环境特有的,代表了浏览器中的全局对象,而 Node.js 运行在一个独立的环境中,没有浏览器相关的全局对象如 window。
如果你希望在 Node.js 中使用类似于浏览器环境中 window.crypto 提供的功能(例如加密操作),你可以利用 Node.js 自带的 crypto 模块来实现。或者使用其他的三方组件库,如“webcrypto”等
Js RSA非对称加密的更多相关文章
- 前端js,后台python实现RSA非对称加密
先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...
- javascript版前端页面RSA非对称加密解密
最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...
- Atitit RSA非对称加密原理与解决方案
Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制 3 1.4. 基于rsa的授权验证机器码 4 1.5. ...
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- RSA非对称加密Java实现
原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...
- 前后端数据加密传输 RSA非对称加密
任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...
- php RSA非对称加密 的实现
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
- ssh rsa 非对称加密 基本原理
我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...
- RSA 非对称加密,私钥转码为pkcs8 错误总结
RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家 ...
- JSON 接口如何实现 RSA 非对称加密与签名
代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...
随机推荐
- 【MATLAB习题】牛头刨床机构的运动学分析
1. 数学模型 已知牛头刨床主运动机构各构件的尺寸为: \(l1=125mm,l3=600mm,l4=150mm,l6=275mm,l'6=575mm\),原动件1以匀角速度ω1=1rad/s逆时针转 ...
- 【小鼓捣】手搓Verilog-CPU测试全流程自动化
自动化流程思路 1.C++/Python:生成大量包含指定指令的mips程序(A.asm) 2.命令行:导出该mips程序指令的机器码(A.txt) 3.魔改MARS:产生测试所需的IM.DM存入信息 ...
- RedisTemplate实现setnx分布式锁
redis工具类 `package com.ttsx.activity.item.services.utils; import lombok.extern.slf4j.Slf4j; import or ...
- Windows编程----内核对象竟然如此简单?
什么是内核对象 内核对象本质上就是内存中的一块内存 ,这块内存由操作系统进行管理和分配,任何应用程序都无法直接操作这块内存区域.至于内核对象的作用,我们暂且不说,这里只需要直到它是内存中的一块内存. ...
- 前缀函数和 KMP "跳步骤"模式匹配
在一篇由字符构成的长文中查找另一个短字符串出现的位置,这可以算是编程领域最最常见的问题(比如按下 Ctrl + F 就可以打开你浏览器的查找功能).这个问题叫做字符串的模式匹配,我们把被查找的关键词叫 ...
- 解决CondaError: Run 'conda init' before 'conda activate'
前言 使用 Anaconda 激活 python 环境,报错: conda activate deepseek7B CondaError: Run 'conda init' before 'conda ...
- Golang入门:协程(goroutine)
goroutine goroutine 是 Go 的并发模型的核心概念.为了理解 goroutine,我们来定义几个术语.第一个是进程.进程是程序的实例,由计算机的操作系统运行.操作系统将一些资源(如 ...
- Django实战项目-学习任务系统-文章汇总
学习任务系统1.0版本已经基本完成了.现在按顺序整理下文章和链接,按照开发时间顺序列举,方便想要完整学习的人. 理论上说,按照文章代码可以搭建该系统的70%主体功能,剩下一些小的功能自己参考现有代码学 ...
- Dicom纯js的三维重建影像浏览器
主要功能介绍 实现通过浏览器浏览Dicom影像阅片.主要功能: 支持标准DIcom影像的2D浏览,预设窗位,伪彩,序列间,序列内多种布局方式. 影像处理,提供影像翻图.缩放.移动.透镜.反相.旋转.截 ...
- delphi+sql数据库增加,删除,修改,查询操作
需要注意的是,open一般用于查询(select),exesql用于修改,插入,删除(update,insert,delete) 增加 with dm.DataModule1.ADOQuery1 do ...