原生js的RSA和AES加密解密算法
更新時間:2016年10月08日 10:53:31 投稿:lijiao
這篇文章主要為大家詳細(xì)介紹了原生js的RSA和AES加密解密算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了js中RSA和AES加密解密詳細(xì)代碼,供大家參考,具體內(nèi)容如下
<!doctype html> <html> <head> <meta charset='UTF-8'> </head> <body> <div class='test'></div> <script type="text/javascript"> function encrypt(data, keyJSON){ var data = new TextEncoder("UTF-8").encode(data); var randomsKeys = geneRandomHexStr(64); // 128 bit keys 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) // use aes to encrypt data // import aes key return crypto.subtle.importKey('raw', hexStringToUint8Array(randomsKeys) , aesAlgo, false, ['encrypt', 'decrypt']); }).then(function(result){ // use aes to encode return crypto.subtle.encrypt(aesAlgo, result, data); }).then(function(encryptedData){ return Promise.resolve({ 'encrypted': bytesToHexString(encryptedData), 'encryptedKey': encryptedKey, }); }); //console.log(new TextDecoder("UTF-8").decode(data)); // use server public key to encrypt } function decrypt(data, keyJSON){ // use local private key to decrypt var encryptedKey = new hexStringToUint8Array(data.encryptedKey); var encryptedData = new hexStringToUint8Array(data.encrypted); var aesAlgo = {name: 'aes-cbc', iv: hexStringToUint8Array("000102030405060708090a0b0c0d0e0f")}; // decrypt key 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){ // import aes key return crypto.subtle.importKey('raw', decryptedKey, aesAlgo, false, ['encrypt', 'decrypt']); }).catch(function(){ console.error("decrypt error"); }).then(function(result){ // decode encrypted data 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"}, // RsaKeyGenParams modulusLength: 2048, publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // Equivalent to 65537 }; var nonExtractable = false; var publicKey = ""; var privateKey = ""; var keyPairs = ""; return crypto.subtle.generateKey(algorithmKeyGen, true, ['encrypt', 'decrypt']).then(function(result) { // gene key pair 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; } 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); }); }); }) </script> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)數(shù)值自動增加動畫
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)數(shù)值自動增加動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12JS實(shí)現(xiàn)固定在右下角可展開收縮DIV層的方法
這篇文章主要介紹了JS實(shí)現(xiàn)固定在右下角可展開收縮DIV層的方法,右下角的div層可實(shí)現(xiàn)收縮與展開的功能,非常具有實(shí)用價值,需要的朋友可以參考下2015-02-02javaScript中一些常見的數(shù)據(jù)類型檢查校驗(yàn)
最近在面試的時候又被問到JS中檢查校驗(yàn)數(shù)據(jù)類型的方法,所以這篇文章主要給大家介紹了關(guān)于javaScript中一些常見的數(shù)據(jù)類型檢查校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-05-05JS正則RegExp.test()使用注意事項(xiàng)(不具有重復(fù)性)
這篇文章主要介紹了JS正則RegExp.test()使用注意事項(xiàng),結(jié)合實(shí)例形式分析了RegExp.test()方法的功能與用法,以及針對不能重復(fù)調(diào)用的解決方法,需要的朋友可以參考下2016-12-12一個用javascript寫的select支持上下鍵、首字母篩選以及回車取值的功能
一個用javascript寫的select支持上下鍵、首字母篩選以及回車取值的功能2009-09-09