原生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. Linux基础_3_文件/文件夹权限管理

    注:权限遮罩码: 控制用户创建文件和文件夹的默认安全设置,文件默认权限为666-umask的值,文件夹默认权限为777-umask的值. root默认0022,普通用户默认0002. 文件的默认权限不 ...

  2. Linux系统安装宝塔面板教程

    # Linux系统宝塔安装教程 注意:安装宝塔面板的前提条件 首先要有一台服务器或者使用linux系统的虚拟机. 安装前请确保是[全新的机器].必须是没装过其它环境的新系统,如Apache/Nginx ...

  3. python信息检索实验之向量空间模型与布尔检索

    import numpy as np import pandas as pd import math def bool_retrieval(string): if string.count('and' ...

  4. 记录一次sshd服务启动失败

    记录一次sshd服务启动失败 问题描述: 服务器开机之后发现无法通过远程连接服务器终端,但是服务器并未宕机,于是考虑到sshd服务出现异常 解决思路: 查看服务器sshd服务运行情况 [root@ha ...

  5. 七、docker镜像私有仓库

    在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...

  6. RDF/RDFS/OWL

    RDF(Resource Description Framework 资源描述框架) 知识总是以三元组形式出现: (subject, predicate, object) 即 (主,谓,宾) 资源和属 ...

  7. 谣言检测(RDCL)——《Towards Robust False Information Detection on Social Networks with Contrastive Learning》

    论文信息 论文标题:Towards Robust False Information Detection on Social Networks with Contrastive Learning论文作 ...

  8. vim编译器

    光标移动,模式切换,删除,查找,复制,粘贴,撤销 vim的三种模式(重点) vim存在的三种模式 命令模式,编辑模式,尾行模式 命令 模式:不能直接编辑.但是可以用快捷键进行一些操作(删除,复制,移动 ...

  9. 看了同事这10个IDEA神级插件,我也悄悄安装了

    昨天,有读者私信发我一篇文章,说里面提到的 Intellij IDEA 插件真心不错,基本上可以一站式开发了,希望能分享给更多的小伙伴,我在本地装了体验了一下,觉得确实值得推荐,希望小伙伴们有时间也可 ...

  10. 基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

    WoodpeckerCI 是一个由社区维护的 DroneCI 分支,使用 Apache License 2.0 许可证发布.社区版进一步扩展了 pipeline 的功能特性.支持对文件路径设置 pip ...