Files
zgty-mas-m/nx/utils/crypto.js
houjunxiang 386f1e7466 1
2025-10-09 18:19:55 +08:00

160 lines
3.6 KiB
JavaScript

import CryptoJS from 'crypto-js';
import { SM4 } from 'gm-crypto';
import { apiCrypto } from '@/nx/config'
/**
* api报文加密
*/
export class ApiEncryption {
constructor() {
this.defaultEncType = apiCrypto.type
this.aesKey = apiCrypto.aesKey
this.desKey = apiCrypto.desKey
this.sm4Key = apiCrypto.sm4Key
}
/**
* 加密数据
* @param data 待加密的数据
* @returns
*/
encrypt(data) {
let encryptData
switch (this.defaultEncType) {
case 'aes':
encryptData = this.encryptAES(data, this.aesKey)
break
case 'des':
encryptData = this.encryptDES(data, this.desKey)
break
case 'sm4':
encryptData = this.encryptSM4(data, this.sm4Key)
break
default:
encryptData = this.encryptAES(data, this.aesKey)
break
}
return encryptData
}
/**
* 解密
* @param data 待解密的数据
* @returns
*/
decrypt(data) {
let decryptData
switch (this.defaultEncType) {
case 'aes':
decryptData = this.decryptAES(data, this.aesKey)
break
case 'des':
decryptData = this.decryptDES(data, this.desKey)
break
case 'sm4':
decryptData = this.decryptSM4(data, this.sm4Key)
break
default:
decryptData = this.decryptAES(data, this.aesKey)
break
}
return decryptData
}
/**
* aes加密
* @param data 待加密数据
* @param key aes密钥
* @returns
*/
encryptAES(data, key) {
const dataBytes = CryptoJS.enc.Utf8.parse(data)
const keyBytes = CryptoJS.enc.Utf8.parse(key)
const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, {
iv: keyBytes,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
/**
* aes解密
* @param data 待解密数据
* @param key 密钥key
* @returns
*/
decryptAES(data, key) {
const keyBytes = CryptoJS.enc.Utf8.parse(key)
const decrypted = CryptoJS.AES.decrypt(data, keyBytes, {
iv: keyBytes,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return CryptoJS.enc.Utf8.stringify(decrypted)
}
/**
* des加密
* @param data 待加密数据
* @param key des密钥
* @returns
*/
encryptDES(data, key) {
const keyBytes = CryptoJS.enc.Utf8.parse(key)
const encrypted = CryptoJS.DES.encrypt(data, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
}
/**
* des解密
* @param data 待解密数据
* @param key des密钥
* @returns
*/
decryptDES(data, key) {
const keyBytes = CryptoJS.enc.Utf8.parse(key)
//const cipherText = CryptoJS.enc.Base64.parse(data);
const decrypted = CryptoJS.DES.decrypt(data, keyBytes, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return decrypted.toString(CryptoJS.enc.Utf8)
}
/**
* sm4加密
* @param data 待加密数据
* @param key sm4密钥
*/
encryptSM4(data, key) {
const keyBytes = CryptoJS.enc.Utf8.parse(key)
const keyHex = CryptoJS.enc.Hex.stringify(keyBytes)
//console.log(data);
//console.log(keyHex);
return SM4.encrypt(data, keyHex, {
inputEncoding: 'utf8',
outputEncoding: 'base64'
})
}
/**
* sm4解密
* @param data 待解密数据
* @param key sm4密钥
*/
decryptSM4(data, key) {
const keyBytes = CryptoJS.enc.Utf8.parse(key)
const keyHex = CryptoJS.enc.Hex.stringify(keyBytes)
return SM4.decrypt(data, keyHex, {
inputEncoding: 'base64',
outputEncoding: 'utf8'
})
}
}