首页 > 其他分享 >原生js实现rsa加密

原生js实现rsa加密

时间:2022-12-17 22:34:30浏览次数:48  
标签:function return name rsa js subtle var 加密 crypto

原生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}

 

标签:function,return,name,rsa,js,subtle,var,加密,crypto
From: https://www.cnblogs.com/sanrenblog/p/16989742.html

相关文章

  • JVM 使用jstat分析系统的垃圾回收情况
    jstat-gcutil输出结果分析_助你了解jvm命令,查找JVM堆栈信息,分析性能问题。下面介绍一下jstat命令:jstat:虚拟机统计信息监视工具(JVMStatisticsMonitoringTool)说明:监......
  • cpp jsoncpp serialize anddeserialize complete example
    //Model/Book.h#pragmaonce#ifndef__Book_H__#define__Book_H__#include<chrono>#include<ctime>#include<fstream>#include<iostream>#include<jsoncpp/......
  • Next.js 开发商 Vercel 正式推出 Edge Functions
    Next.js开发商Vercel正式推出EdgeFunctions来源:OSCHINA编辑: 白开水不加糖2022-12-1707:49:24 0Next.js框架背后的开发商Vercel 宣布推出Edg......
  • Java_JSP电子政务网(论文+源码)
    摘要当前阶段,伴随着社会信息技术的快速发展,使得电子政务能够成为我国政府职能部门进行办公管理的一个重要内容,其中就包括了提升办公效率完善服务质量以及实现信息共享等。......
  • 从零开始学node.js笔记 01
    一.什么是node.js:Node.js是一个基于Chromev8引擎的JavaScript运行环境浏览器是JavaScript的前端运行环境node.js是javas的后端运行环境在node.js中无法调用DOM和BOM等浏览......
  • js的变量使用规范
    1:js如果更新一个变量,会以最后的结果出现。例如:varmyname='aaa'; myname='bbb';console.log(myname);最后控制台输出的是bbb2:js如果要声明多个变量,中间用逗号隔开,例......
  • fastjson全局日期序列化设置导致JSONField无效
    问题描述fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊日期返回格式失效使用版本应用名称版本springboot2.0.0.RELEASE......
  • fastjson全局日期序列化设置导致JSONField无效
    问题描述fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊日期返回格式失效使用版本应用名称版本springboot2.0.0.RELEASE......
  • 使用mockjs模拟数据
    相关介绍在常见的前后端开发模式中,经常因为一些接口的问题导致工程效率低。作为前端开发者我们有时候可以使用mockjs来模拟后端的接口,只需要做到模拟就行,主要是用来检测我......
  • 前端知识学习案例2-开发企业网站2-准备js库 图片等
    animejs库控制动画得库 glide.js isotope scrollReveal smooth-scroll......