nodejs封装加解密公共方法

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

});

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值