原生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. 可观测性的常见用例|Techtarget

    [ 文章来源 ]https://www.techtarget.com/searchitoperations/tip/Common-use-cases-for-observability 这些可观测性用 ...

  2. 成功解决Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings

    文章目录 1.问题描述 2.问题的解决方式 2.1 查看网络连接问题 2.2 设置代理 2.3 直接连接阿里云下载模板 1.问题描述 建立springboot项目的时候发现不能初始化成功,我真的栓Q ...

  3. 我用EasyExcel优化了公司的导出(附踩坑记录)

    背景介绍 最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有 excel 的第二个 sheet 上.考虑到数据量还比较大,干脆引入阿里的 EasyExcel 来做. 下面 ...

  4. Pycharm系列---QT配置

    PYSIDE2 添加外部工具 file---settings External Tools,点击左上角的 加号+ designer 位置: envs\QT6\Lib\site-packages\PyS ...

  5. Vue2基础知识学习

    Vue2基础知识学习 01.初识 new Vue({ el: '#root', //用于指定当前Vue实例为哪个容器服务,值通常为css选择器符 data () { return { } } }); ...

  6. mybatis-plus分页失效原因

    mybatis-plus分页失效解决方法 方法一.在启动类添加如下配置 @SpringBootApplication @MapperScan("com.**.mapper") pu ...

  7. 【深入浅出 Yarn 架构与实现】3-3 Yarn Application Master 编写

    本篇文章继续介绍 Yarn Application 中 ApplicationMaster 部分的编写方法. 一.Application Master 编写方法 上一节讲了 Client 提交任务给 ...

  8. 网络编程:软件开发架构、架构总结、网络编程前戏、OSI七层协议简介、OSI七层协议之物理连接层、数据链路层、网络相关专业名词、OSI七层协议之网络层

    目录 软件开发架构 架构总结 网络编程前戏 OSI七层协议简介 OSI七层协议之物理连接层 OSI七层协议之数据链路层 网络相关专业名词 OSI七层协议之网络层 OSI七层协议之传输层 软件开发架构 ...

  9. i春秋exec

    打开是一个gif,提示文字未登录 话不多说,查看源码 发现vim字样,可能是文件泄露 直接在url后加/.index.php.swp来下载泄露文件 下载好了之后放vm上使用vim -r  .index ...

  10. Objects.requireNonNull的意义是什么

    Objects.requireNonNull方法的源码是这样: public static <T> T requireNonNull(T obj) { if (obj == null) t ...