160 lines
3.6 KiB
JavaScript
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'
|
|
})
|
|
}
|
|
}
|