167 lines
4.4 KiB
JavaScript
167 lines
4.4 KiB
JavaScript
var CryptoJS = require("crypto-js");
|
|
var fHEX = require("crypto-js/format-hex");
|
|
|
|
function enc(text, key){
|
|
var encrypt = CryptoJS.TripleDES.encrypt(text, key, {
|
|
mode: CryptoJS.mode.ECB, // CBC模式
|
|
// mode: CryptoJS.mode.ECB, // ECB模式
|
|
padding: CryptoJS.pad.NoPadding // padding处理
|
|
}
|
|
);
|
|
var encryptData = encrypt.toString(fHEX); // 加密完成后,转换成字符串
|
|
// console.log(encryptData)
|
|
return encryptData
|
|
|
|
}
|
|
|
|
/**
|
|
* int 转 byte
|
|
* @param i
|
|
*/
|
|
function intToByte(i) {
|
|
var b = i & 0xFF;
|
|
var c = 0;
|
|
if (b >= 128) {
|
|
c = b % 128;
|
|
c = -1 * (128 - c);
|
|
} else {
|
|
c = b;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
function stringToHex(str){
|
|
var val = "";
|
|
for (var i = 0; i < str.length; i++) {
|
|
var v = str.charCodeAt(i).toString(16);
|
|
if ( v.length < 2 ) {
|
|
v = "0" + v;
|
|
}
|
|
val += v;
|
|
}
|
|
return val
|
|
}
|
|
function toHex(d) { return ("0"+(Number(d).toString(16))).slice(-2).toUpperCase() }
|
|
|
|
function mac( hex ) {
|
|
if ( ! /^([A-Fa-f0-9][A-Fa-f0-9])+$/.test( hex ) ) {
|
|
throw "hex 格式错误"
|
|
}
|
|
var checkNum = intToByte(0);
|
|
var arrBytes = new Array();
|
|
for ( var i = 0 ; i < hex.length; i+=2 ) {
|
|
var v = intToByte(parseInt(hex[i] + hex[i+1], 16))
|
|
arrBytes.push( v )
|
|
checkNum = checkNum ^ v;
|
|
}
|
|
|
|
return toHex( checkNum & 0xFF )
|
|
}
|
|
|
|
function xor(d1, d2, d3) {
|
|
if ( 32 !== d1.length || 32 !== d2.length || 32 !== d3.length ) {
|
|
throw "输入格式错误"
|
|
}
|
|
|
|
var a1 = hexToBytes(d1);
|
|
var a2 = hexToBytes(d2);
|
|
var a3 = hexToBytes(d3);
|
|
|
|
var data = [];
|
|
for ( var i = 0; i < 16 ; i++){
|
|
data[ i ] = a1[ i ] ^ a2[ i ] ^ a3[ i ]
|
|
}
|
|
|
|
return bytesToHex( data )
|
|
}
|
|
|
|
// Des3
|
|
// npm i crypto-js
|
|
function hexToBytes(hex) {
|
|
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
|
bytes.push(parseInt(hex.substr(c, 2), 16));
|
|
return bytes;
|
|
}
|
|
|
|
function bytesToHex(bytes) {
|
|
for (var hex = [], i = 0; i < bytes.length; i++) {
|
|
hex.push((bytes[i] >>> 4).toString(16));
|
|
hex.push((bytes[i] & 0xF).toString(16));
|
|
}
|
|
return hex.join("");
|
|
}
|
|
|
|
const des = {
|
|
CalDES: function (a1, a2) {
|
|
a1 = "00000000000000000000000000000000"
|
|
a2 = bytesToHex(a2)
|
|
// var data = [];
|
|
// for ( var i = 0; i < 16 ; i++){
|
|
// data[ i ] = a1[ i ] ^ a2[ i ]
|
|
// }
|
|
|
|
// return bytesToHex( data )
|
|
|
|
var text = CryptoJS.enc.Hex.parse(a1);
|
|
var key = CryptoJS.enc.Hex.parse(a2);
|
|
return enc(text, key);
|
|
|
|
}
|
|
}
|
|
|
|
const sm4 = require('./sm4.js')
|
|
|
|
|
|
// 校验值
|
|
function checkValue(p1,p2,p3) {
|
|
var keyPlaintext = xor(p1, p2, p3)
|
|
// 废弃 des 算法
|
|
// var ret = des.CalDES(hexToBytes("0000000000000000"), hexToBytes(keyPlaintext))
|
|
var ret = sm4.SM4CryptECB("00000000000000000000000000000000", 1, keyPlaintext)
|
|
const checkValue = ret.slice(0, 8)
|
|
return { checkValue, ret, keyPlaintext }
|
|
}
|
|
|
|
// 校验值
|
|
function checkValueKey(l1,l2,l3, protectKey) {
|
|
const key = xor(l1,l2,l3)
|
|
var ret = sm4.SM4CryptECB("00000000000000000000000000000000", 1, key)
|
|
const checkValue = ret.slice(0, 8)
|
|
const keyCiphertext = sm4.SM4CryptECB(key, 1 , protectKey)
|
|
return { keyCiphertext, checkValue, ret}
|
|
}
|
|
|
|
function decryptionKey(keyCiphertext, checkValue) {
|
|
const keyPlaintext = sm4.SM4CryptECB(keyCiphertext, 0, checkValue)
|
|
let ret = kcv( keyCiphertext )
|
|
const checkData = ret.slice(0, 8)
|
|
return { keyPlaintext, checkData }
|
|
}
|
|
|
|
/**
|
|
* 计算密钥校验值
|
|
* key 是密钥 16 字节的 HEX 格式。
|
|
*/
|
|
function kcv( key ){
|
|
const v = sm4.SM4CryptECB("00000000000000000000000000000000", 1, key)
|
|
return v;
|
|
}
|
|
|
|
function decryptKey(value, key){
|
|
const v = sm4.SM4CryptECB(value, 0, key)
|
|
return v;
|
|
}
|
|
|
|
module.exports = { xor, kcv, decryptKey, checkValue, checkValueKey, decryptionKey }
|
|
|
|
// const tripledes = require("crypto-js/tripledes");
|
|
//
|
|
// var value = "123";CryptoJS.enc.Hex.parse("0000000000000000");
|
|
// var key = "12345678123456781234567812345678"; CryptoJS.enc.Hex.parse("12345678123456781234567812345678");
|
|
//
|
|
// var encrypted = tripledes.encrypt(value , key);
|
|
// var decrypted = tripledes.decrypt(encrypted, key);
|
|
//
|
|
// console.log( "encrypted", encrypted.toString('hex') )
|
|
// console.log( "decrypted", decrypted )
|