121 lines
3.5 KiB
TypeScript
121 lines
3.5 KiB
TypeScript
|
|
import CryptoJS from 'crypto-js';
|
|||
|
|
import CryptoSM from 'sm-crypto';
|
|||
|
|
|
|||
|
|
function object2string(data) {
|
|||
|
|
if (typeof data === 'object') {
|
|||
|
|
return JSON.stringify(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let str = JSON.stringify(data);
|
|||
|
|
if (str.startsWith("'") || str.startsWith('"')) {
|
|||
|
|
str = str.substring(1);
|
|||
|
|
}
|
|||
|
|
if (str.endsWith("'") || str.endsWith('"')) {
|
|||
|
|
str = str.substring(0, str.length - 1);
|
|||
|
|
}
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 字符串转为数字
|
|||
|
|
*/
|
|||
|
|
function stringToHex(str) {
|
|||
|
|
let hex = '';
|
|||
|
|
for(let i = 0; i < str.length; i++) {
|
|||
|
|
hex += str.charCodeAt(i).toString(16).padStart(2, '0');
|
|||
|
|
}
|
|||
|
|
return hex;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* -------------------- ※ AES 加密、解密 begin ※ --------------------
|
|||
|
|
*
|
|||
|
|
* 1、AES加密算法支持三种密钥长度:128位、192位和256位,这里选择128位
|
|||
|
|
* 2、AES 要求秘钥为 128bit,转化字节为 16个字节;
|
|||
|
|
* 3、js前端使用 UCS-2 或者 UTF-16 编码,字母、数字、特殊符号等 占用1个字节;
|
|||
|
|
* 4、所以:秘钥Key 组成为:字母、数字、特殊符号 一共16个即可
|
|||
|
|
*
|
|||
|
|
* -------------------- ※ AES 加密、解密 end ※ --------------------
|
|||
|
|
*/
|
|||
|
|
const AES_KEY = '1024lab__1024lab';
|
|||
|
|
|
|||
|
|
const AES = {
|
|||
|
|
encryptData: function (data) {
|
|||
|
|
// AES 加密 并转为 base64
|
|||
|
|
let utf8Data = CryptoJS.enc.Utf8.parse(object2string(data));
|
|||
|
|
const key = CryptoJS.enc.Utf8.parse(AES_KEY);
|
|||
|
|
const encrypted = CryptoJS.AES.encrypt(utf8Data, key, {
|
|||
|
|
mode: CryptoJS.mode.ECB,
|
|||
|
|
padding: CryptoJS.pad.Pkcs7,
|
|||
|
|
});
|
|||
|
|
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
decryptData: function (data) {
|
|||
|
|
// 第一步:Base64 解码
|
|||
|
|
let words = CryptoJS.enc.Base64.parse(data);
|
|||
|
|
|
|||
|
|
// 第二步:AES 解密
|
|||
|
|
const key = CryptoJS.enc.Utf8.parse(AES_KEY);
|
|||
|
|
return CryptoJS.AES.decrypt({ ciphertext: words }, key, {
|
|||
|
|
mode: CryptoJS.mode.ECB,
|
|||
|
|
padding: CryptoJS.pad.Pkcs7,
|
|||
|
|
}).toString(CryptoJS.enc.Utf8);
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* -------------------- ※ 国密SM4算法 加密、解密 begin ※ --------------------
|
|||
|
|
*
|
|||
|
|
* 1、国密SM4 要求秘钥为 128bit,转化字节为 16个字节;
|
|||
|
|
* 2、js前端使用 UCS-2 或者 UTF-16 编码,字母、数字、特殊符号等 占用1个字节;
|
|||
|
|
* 3、java中 每个 字母数字 也是占用1个字节;
|
|||
|
|
* 4、所以:前端和后端的 秘钥Key 组成为:字母、数字、特殊符号 一共16个即可
|
|||
|
|
*
|
|||
|
|
* -------------------- ※ 国密SM4算法 加密、解密 end ※ --------------------
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// 秘钥Key 组成为:字母、数字、特殊符号 一共16个即可
|
|||
|
|
const SM4_KEY = '1024lab__1024lab';
|
|||
|
|
|
|||
|
|
const SM4 = {
|
|||
|
|
encryptData: function (data) {
|
|||
|
|
// 第一步:SM4 加密
|
|||
|
|
let encryptData = CryptoSM.sm4.encrypt(object2string(data), stringToHex(SM4_KEY));
|
|||
|
|
// 第二步: Base64 编码
|
|||
|
|
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(encryptData));
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
decryptData: function (data) {
|
|||
|
|
// 第一步:Base64 解码
|
|||
|
|
let words = CryptoJS.enc.Base64.parse(data);
|
|||
|
|
let decode64Str = CryptoJS.enc.Utf8.stringify(words);
|
|||
|
|
|
|||
|
|
// 第二步:SM4 解密
|
|||
|
|
return CryptoSM.sm4.decrypt(decode64Str, stringToHex(SM4_KEY));
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// ----------------------- 对外暴露: 加密、解密 -----------------------
|
|||
|
|
|
|||
|
|
// 默认使用SM4算法
|
|||
|
|
const EncryptObject = SM4;
|
|||
|
|
// const EncryptObject = AES;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 加密
|
|||
|
|
*/
|
|||
|
|
export const encryptData = function (data) {
|
|||
|
|
return !data ? null : EncryptObject.encryptData(data);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 解密
|
|||
|
|
*/
|
|||
|
|
export const decryptData = function (data) {
|
|||
|
|
return !data ? null : EncryptObject.decryptData(data);
|
|||
|
|
};
|