nodejs封装加解密方法
使用nodejs开发服务器端应用的时候,加解密方法实现。
公共方法定义文件
encrypt.js
const crypto = require('crypto');
var algorithm = { ecb:'des-ecb',cbc:'des-cbc' };
function cipherivEncrypt(data, key, iv) {
var key = new Buffer(key);
var iv = new Buffer(iv ? iv : 0);
const cipheriv = crypto.createCipheriv(algorithm.ecb, key, iv)
let encrypted = cipheriv.update(data, 'utf8', 'hex');
encrypted += cipheriv.final('hex');
return encrypted;
}
function cipherivDecrypt(data, key, iv){
var key = new Buffer(key);
var iv = new Buffer(iv ? iv : 0);
const decipher = crypto.createDecipheriv(algorithm.ecb, key, iv);
decipher.setAutoPadding(true);
var txt = decipher.update(data, 'hex', 'utf8');
txt += decipher.final('utf8');
return txt;
}
function getKey(key){
key = stringToByte(key)
var arrB = new Array(0,0,0,0,0,0,0,0,);
for (var i = 0; (i < key.length) && (i < arrB.length); ++i)
{
arrB[i] = key[i];
}
arrB.length=8;
return arrB;
};
function stringToByte(str) {
var bytes = new Array();
var len, c;
len = str.length;
for(var i = 0; i < len; i++) {
c = str.charCodeAt(i);
if(c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF);
}
}
return bytes;
}
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
//base64加密
function base64encode(str) {
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while(i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if(i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if(i == len){
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
}
//base64解密
function base64decode(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while(i < len) {
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
} while(i < len && c1 == -1);
if(c1 == -1)
break;
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
} while(i < len && c2 == -1);
if(c2 == -1)
break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
do {
c3 = str.charCodeAt(i++) & 0xff;
if(c3 == 61)
return out;
c3 = base64DecodeChars[c3];
} while(i < len && c3 == -1);
if(c3 == -1)
break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
do {
c4 = str.charCodeAt(i++) & 0xff;
if(c4 == 61)
return out;
c4 = base64DecodeChars[c4];
} while(i < len && c4 == -1);
if(c4 == -1)
break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
}
return out;
}
module.exports = {'base64encode':base64encode,
'base64decode':base64decode,
'cipherivEncrypt':cipherivEncrypt,
'cipherivDecrypt':cipherivDecrypt,
'getKey':getKey};
加解密方法调用示例
test.js
const express = require('express');
const router = express.Router();
const encrypt = require('../xxx/encrypt');//适当的路径引入encrypt.js
//base64加密调用示例 解密调用示例
router.get('/testbase64',function(req,res,next){
console.log(encrypt);
var str = '23030219790511475210';
var str2 = encrypt.base64encode(str);
var str3 = encrypt.base64decode(str2);
res.send({"base64Before":str,"base64encode":str2,"base64decode":str3});
})
//des根据密钥进行加解密
router.get('/testdes',function(req, res,next){
var str="activeCustId=123456&loginNo=aahexx&extraTime=12345678";
str=encodeURI(str);
var key="1234adcdef";
key= encrypt.getKey(key);
var encrypted = encrypt.cipherivEncrypt(str, key);
//解密
var key2=="1234adcdef";
key2= encrypt.getKey(key2);
var decrypted = encrypt.cipherivDecrypt(encrypted, key2);
res.send({"desBefore":str,"desEncrypt":encrypted,"desDecrypt":decrypted});
});