js java aes rsa_原生js的RSA和AES加密解密算法

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);

});

});

})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值