原生js实现rsa加密

示例

createNewUserKey().then(function(keyPairs) {
encrypt("this is origin text", keyPairs[0]).then(function(res) {
console.log('public', JSON.stringify(keyPairs[0]));
console.log('private', JSON.stringify(keyPairs[1]));
decrypt(res, keyPairs[1]).then(function(decrypted) {
console.log('decrypted', decrypted);
});
});
});

源码

function encrypt(data,keyJSON){var data=new TextEncoder("UTF-8").encode(data);var randomsKeys=geneRandomHexStr(64);var encryptedKey=hexStringToUint8Array(randomsKeys);var aesAlgo={name:'aes-cbc',iv:hexStringToUint8Array("000102030405060708090a0b0c0d0e0f")};return crypto.subtle.importKey("jwk",keyJSON,{name:"rsa-oaep",hash:{name:"sha-256"}},true,['encrypt']).then(function(publicKey){return crypto.subtle.encrypt({name:"rsa-oaep"},publicKey,encryptedKey)}).then(function(res){encryptedKey=bytesToHexString(res);return crypto.subtle.importKey('raw',hexStringToUint8Array(randomsKeys),aesAlgo,false,['encrypt','decrypt'])}).then(function(result){return crypto.subtle.encrypt(aesAlgo,result,data)}).then(function(encryptedData){return Promise.resolve({'encrypted':bytesToHexString(encryptedData),'encryptedKey':encryptedKey,})})}function decrypt(data,keyJSON){var encryptedKey=new hexStringToUint8Array(data.encryptedKey);var encryptedData=new hexStringToUint8Array(data.encrypted);var aesAlgo={name:'aes-cbc',iv:hexStringToUint8Array("000102030405060708090a0b0c0d0e0f")};return crypto.subtle.importKey('jwk',keyJSON,{name:"rsa-oaep",hash:{name:"sha-256"}},true,['decrypt']).then(function(privateKey){return crypto.subtle.decrypt({name:'rsa-oaep'},privateKey,encryptedKey)}).then(function(decryptedKey){return crypto.subtle.importKey('raw',decryptedKey,aesAlgo,false,['encrypt','decrypt'])}).catch(function(){console.error("decrypt error")}).then(function(result){return crypto.subtle.decrypt(aesAlgo,result,encryptedData)}).then(function(data){return Promise.resolve(new TextDecoder("UTF-8").decode(new Uint8Array(data)))})}function createNewUserKey(){var algorithmKeyGen={name:"RSA-OAEP",hash:{name:"sha-256"},modulusLength:2048,publicExponent:new Uint8Array([0x01,0x00,0x01]),};var nonExtractable=false;var publicKey="";var privateKey="";var keyPairs="";return crypto.subtle.generateKey(algorithmKeyGen,true,['encrypt','decrypt']).then(function(result){keyPairs=result;return Promise.all([crypto.subtle.exportKey("jwk",keyPairs.publicKey),crypto.subtle.exportKey("jwk",keyPairs.privateKey)])})}function _arrayBufferToBase64(buffer){var binary='';var bytes=new Uint8Array(buffer);var len=bytes.byteLength;for(var i=0;i<len;i++){binary+=String.fromCharCode(bytes[i])}return window.btoa(binary)}function hexStringToUint8Array(hexString){if(hexString.length%2!=0)throw"Invalid hexString";var arrayBuffer=new Uint8Array(hexString.length/2);for(var i=0;i<hexString.length;i+=2){var byteValue=parseInt(hexString.substr(i,2),16);if(byteValue==NaN)throw"Invalid hexString";arrayBuffer[i/2]=byteValue}return arrayBuffer}function bytesToHexString(bytes){if(!bytes)return null;bytes=new Uint8Array(bytes);var hexBytes=[];for(var i=0;i<bytes.length;++i){var byteString=bytes[i].toString(16);if(byteString.length<2)byteString="0"+byteString;hexBytes.push(byteString)}return hexBytes.join("")}function geneRandomHexStr(length){var text="";var possible="0123456789abcdef";for(var i=0;i<length;i++)text+=possible.charAt(Math.floor(Math.random()*possible.length));return text}

原生js实现rsa加密的更多相关文章

  1. Python3 实现 JS 中 RSA 加密的 NoPadding 模式

    前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...

  2. 用cryptico.js实现RSA加密(应对cryptico不支持PEM)

    问题: 随手分享一下好了,这个问题困扰了很久. cryptico.js这个加密算法库很全,很适合在前端用到各种加密解密算法的需求.但是美中不足的是,它的RSA加密不支持PEM格式,所以如果你后端用ja ...

  3. JS 使用RSA加密解密

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>使 ...

  4. JS客户端RSA加密,Java服务端解密

    常用语网页客户端对密码加密,在后端java解密还原 java代码依赖    <dependency>      <groupId>commons-codec</group ...

  5. Js参数RSA加密传输,jsencrypt.js的使用

    注意几点: 1.参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了. 1.前段代码 <!DOCTYPE html> <html> <head> < ...

  6. 利用security.js实现RSA加密

    在通常的http协议的网站中直接提交数据可以通过信息抓取从而暴露提交者所提交的信息,特别是注册时的密码和登录时的密码容易被泄露. 那么怎么防止这种现象呢? 很多人会想到加密技术,对没错,本文所讲的就是 ...

  7. React Native + Nodejs 使用RSA加密登录

    想用rn做个RSA(非对称加密)登录 基本流程就是在服务端生成RSA后,将“公钥”发到客户端,然后客户端用“公钥”加密信息发送到服务端,服务务端用私钥解密. 过程不复杂,问题在于,nodejs和rn都 ...

  8. vue实现rsa加密,数字签名,md5加密等

    一.使用jsencrypt进行rsa加密 原文链接:Js参数RSA加密传输,jsencrypt.js的使用 - CSDN博客 *(原文处有一个地方不对,不需要转换+,rsa已经做过base64转码了) ...

  9. vue使用JSEncrypt实现rsa加密及挂载方法

    挂载全局方法 使用jsencrypt进行rsa加密 原文链接:Js参数RSA加密传输,jsencrypt.js的使用 - CSDN博客* https://blog.csdn.net/p31201115 ...

随机推荐

  1. vulnhub靶场|NAPPING: 1.0.1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NAPPING: 1.0.1,地址我这里设置的桥接,,下载地址:https://download.vulnhub.com/napping/nap ...

  2. 使用HTML表单收集数据

    1.什么是表单 在项目开发过程中,凡是需要用户填写的信息都需要用到表单. #2.form标签 在HTML中我们使用form标签来定义一个表单.而对于form标签来说有两个最重要的属性:action和m ...

  3. 狂神说mysql笔记

    1.mysql 基本操作 Windows-->Mysql5.7打开 输入用户名和密码 查看数据库 :show databases:查询所有数据库,记住一定要加分号结尾 这里必须全部为 英文空格 ...

  4. MAUI 初体验 联合 WinForm 让家里废弃的手机当做电脑副品用起来

    软件效果图 软件架构草图 效果解释:运行 winform 端后 使用 ctrl+c 先复制任何词语,然后ctrl+空格 就可以将翻译结果显示在 安卓,IOS,windows 甚至 mac 任意客户端 ...

  5. 【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(一)

    kubernetes v1.23.3 二进制部署 1. 组件版本和配置策略 1.1 主要组件版本 1.2 主要配置策略 2. 初始化系统和全局变量 2.1 集群规划 2.2 kubelet cri-o ...

  6. 基于python的数学建模---场线与数值解(微分方程)

    import numpy as np from scipy import integrate import matplotlib.pyplot as plt import sympy def plot ...

  7. 【DL论文精读笔记】 深度压缩

    深度压缩 DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFM ...

  8. 第1章-Spring的模块与应用场景

    目录 一.Spring模块 1. 核心模块 2. AOP模块 3. 消息模块 4. 数据访问模块 5. Web模块 6. 测试模块 二.集成功能 1. 目标原则 2. 支持组件 三.应用场景 1. 典 ...

  9. vite安装使用流程

    安装vite 使用npm npm create vite@latest 使用yarn yarn create vite 使用pnpm pnpm create vite 还有一些选择配置比如使用那种框架 ...

  10. <十>关于菱形继承

    代码1 #include <iostream> using namespace std; class A{ public: A(int _a):ma(_a){ cout<<&q ...