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