前端用crypto-js
实现加解密,node端用Crypto模块
,两者想要相同结果的话,就要保持加密密钥和加密算法一致。
crypto-js加密、解密
参考:
『crypto-js 加密和解密』
前端使用CryptoJS加密解密
// DES算法
import CryptoJS from 'crypto-js'// 16位十六进制数作为密钥(秘钥为随机生成,必须与后端保持一致!)
const SECRET_KEY = CryptoJS.enc.Utf8.parse('XXX12XXX')
// 16位十六进制数作为密钥偏移量(秘钥为随机生成,必须与后端保持一致!)
const SECRET_IV = CryptoJS.enc.Utf8.parse('XXX12XXX')
// 加密
export const encrypt = (plaintext: string): string => {const dataHex = CryptoJS.enc.Utf8.parse(plaintext)const encrypted = CryptoJS.DES.encrypt(dataHex, SECRET_KEY, {iv: SECRET_IV,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase()
}// 解密
export const decrypt = (encryptText: string): string => {const encryptedHexStr = CryptoJS.enc.Hex.parse(encryptText)const str = CryptoJS.enc.Base64.stringify(encryptedHexStr)const decrypt = CryptoJS.DES.decrypt(str, SECRET_KEY, {iv: SECRET_IV,mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)return decryptedStr.toString()
}
node Crypto加解密模块
参考:
Crypto加解密模块
// des-ecb算法
const crypto = require("crypto");
//加密
function encrypt(plaintext, secret = 'XXX12XXX') {if (typeof plaintext != 'string') {plaintext = plaintext + '';}let key = Buffer.from(secret),iv = Buffer.alloc(0);let cipher = crypto.createCipheriv("des-ecb", key, iv);cipher.setAutoPadding(true);let ciph = cipher.update(plaintext, 'utf8', 'hex');ciph += cipher.final('hex');return ciph.toUpperCase();
}//解密
function decrypt(encrypt_text, secret = 'XXX12XXX') {let key = Buffer.from(secret)const decipher = crypto.createDecipheriv('des-ecb', key, '');let decrypted = decipher.update(encrypt_text, 'hex', 'utf8');decrypted += decipher.final('utf8');return decrypted;
}