原生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. Dropout----Dropout来源

    目录 一.简单介绍及公式 二.为什么dropout有效-原因定性分析 2.1 ensemble论 2.1.1 ensemble 2.1.2 动机:联合适应(co-adapting) 思考: 2.1.3 ...

  2. Shading-JDBC、ShadingSphere、ShardingProxy 使用详解

    ShadingSphere ​ShardingSphere是一款起源于当当网内部的应用框架,2015年在当当网内部诞生,2016年由主要开发人员张亮带入京东数科,在国内经历了当当网.电信翼支付.京东数 ...

  3. 设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元

    现使用策略模式来设计该系统,绘制类图并编程实现 UML类图 书籍 package com.zheng; public class Book { private double price;// 价格 p ...

  4. 实现etcd服务注册与发现

    转载自:实现etcd服务注册与发现 0.1.目录结构 . ├── api │   └── main.go ├── common │   └── common.go ├── docker-compose ...

  5. python批量加密文件

    1.文件名的加密与解密 #coding:utf-8 from docx import Document import os,sys from docx.oxml.ns import qn def fi ...

  6. C#中下载项目中的文件

    1.将需要下载的文档添加到项目的文件夹中 2.接口部分 public IActionResult DownLoad() { var filePath = Directory.GetCurrentDir ...

  7. 题解 SP10500 HAYBALE - Haybale stacking

    前言 想了好久树状数组啥的,后来想想写打个差分再说,结果写完一遍AC了-- 强烈安利 题意 一个由 \(n\) 个元素组成的序列,给出 \(k\) 个操作,每次将 \(a\sim b\) 加上 \(1 ...

  8. TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 本文地址:https://www.showmeai.tech/artic ...

  9. 详细了解JVM运行时内存

    详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...

  10. vim常用快捷键总结一(光标移动命令)

    vim编辑器的工作模式分为3种即(命令模式,编辑模式和尾行模式),具体定义这里就不在赘述了,这里只简单介绍各工作模式下对应的操作和快捷方式. 通常来说三三种模式功能划分大致如下 命令模式:定位.翻页. ...