const CryptoJS = require( "crypto" ); let s_key = null; const CCryptoHelp = { _getKey: function() { if( !s_key ) { s_key = CryptoJS.enc.Utf8.parse( "#KLDf*#!32!~kle1" ); } return s_key; }, // AES加密 encrypt: function( str ) { if( !str || 0 === str.length ) { return ""; } const keyVal = CCryptoHelp._getKey(); let encrypted = CryptoJS.AES.encrypt( str, keyVal, { iv: null, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding } ); return encrypted.toString(); }, // AES解密 decrypt: function( str ) { if( !str || 0 === str.length ) { return ""; } const keyVal = CCryptoHelp._getKey(); let decrypt = CryptoJS.AES.decrypt( str, keyVal, { iv: null, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding } ); return CryptoJS.enc.Utf8.stringify( decrypt ); // let decryptedStr = decrypt.toString( CryptoJS.enc.Utf8 ); // return decryptedStr.toString(); }, // MD5加密 md5FromString: function( str ) { if( !str || 0 === str.length ) { return ""; } return CryptoJS.MD5( str ).toString().toLowerCase(); }, // MD5加密 md5FromBytes: function( unit8Array ) { if( !unit8Array || 0 === unit8Array.length ) { return ""; } let str = CryptoJS.enc.Hex.stringify( unit8Array ); return CryptoJS.MD5( str ).toString().toLowerCase(); }, // 十六进制字符串数组,个数如果不足16整数倍则补0 hexTo16Hex: function( str ) { var diff = 16 - ( str.length + 1 ) / 3 % 16; for( var i = 0; i < diff; i++ ) { str = str + " 00"; } return str; }, // 构建WordArray对象 int8parse: function( u8arr ) { var len = u8arr.length; var words = []; for( var i = 0; i < len; i++ ) { words[ i >>> 2 ] |= ( u8arr[ i ] & 0xff ) << ( 24 - ( i % 4 ) * 8 ); } return CryptoJS.lib.WordArray.create( words, len ); }, // 十六进制字符串(空格分割)转成十进制数字的数组 hexStrToDecArray: function( str ) { var strArray = str.split( " " ); var decArray = []; for( var i = 0; i < strArray.length; i++ ) { decArray.push( parseInt( strArray[ i ], 16 ) ); } return CCryptoHelp.arrayTo16Array( decArray ); }, // 十进制数组转成十六进制字符串 decArrayToHexStr: function( array ) { var hexStr = ""; for( var i = 0; i < array.length; i++ ) { var str = array[ i ].toString( 16 ).toUpperCase(); if( str.length < 2 ) { str = "0" + str; } hexStr = hexStr + str + " "; } return hexStr.substr( 0, hexStr.length - 1 ); }, // word类型的十进制数组转成十六进制字符串 wordArrayToHexStr: function( array ) { var hexStr = ""; for( var i = 0; i < array.length; i++ ) { var num = array[ i ]; if( num < 0 ) { num = array[ i ] + 0x100000000; } var str = num.toString( 16 ).toUpperCase(); var fullStr = str; if( str.length < 8 ) { for( var j = 0; j < 8 - str.length; j++ ) { fullStr = "0" + fullStr; } } hexStr = hexStr + fullStr; } var ret = ""; for( var i = 0; i < hexStr.length; i += 2 ) { ret = ret + hexStr.substr( i, 2 ) + " " } return ret.substr( 0, ret.length - 1 ); }, // 数组元素个数必须是16的整数倍,不足的在后面补0 arrayTo16Array: function( array ) { var len = array.length; var distLen = parseInt( ( array.length - 1 ) / 16 ) * 16 + 16; for( var i = array.length; i < distLen; i++ ) { array[ i ] = 0; } return array; }, }; module.exports = CCryptoHelp;