如何将Node.js crypto的AES加密代码改为CryptoJS适配Golang解密
Vite项目CryptoJS替代原生crypto实现JS加密Golang解密方案
首先安装依赖:
# 安装核心依赖 npm install crypto-js # TS项目额外安装类型定义 npm install @types/crypto-js -D
修正后的CryptoJS加密解密代码
import CryptoJS from 'crypto-js' // 加密逻辑和原Node crypto实现完全对齐,输出可直接给Golang端解密 export const encrypt = (plainText: string, secret: string) => { // 生成16字节随机IV const iv = CryptoJS.lib.WordArray.random(16) // 显式将密钥转成WordArray,避免CryptoJS自动做密钥派生,和Golang端密钥处理逻辑对齐 const secretKey = CryptoJS.enc.Utf8.parse(secret) // 加密配置 const encrypted = CryptoJS.AES.encrypt(plainText, secretKey, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) // IV转Hex + 密文转Hex拼接返回,和原Node crypto输出格式一致 return iv.toString(CryptoJS.enc.Hex) + encrypted.ciphertext.toString(CryptoJS.enc.Hex) } // 对应本地解密方法 export const decrypt = (cipherText: string, secret: string) => { // 前32位为16字节IV的Hex格式 const ivHex = cipherText.slice(0, 32) const iv = CryptoJS.enc.Hex.parse(ivHex) // 剩余内容为密文Hex const ciphertextHex = cipherText.slice(32) const ciphertext = CryptoJS.enc.Hex.parse(ciphertextHex) const secretKey = CryptoJS.enc.Utf8.parse(secret) // 解密,配置项必须传标准iv字段 const decrypted = CryptoJS.AES.decrypt( { ciphertext: ciphertext } as CryptoJS.lib.CipherParams, secretKey, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ) return decrypted.toString(CryptoJS.enc.Utf8) }
关键修改说明(对应原代码出错点)
- 密钥处理:原代码直接传入字符串类型密钥,CryptoJS会默认执行EVP密钥派生,和Golang端直接拿密钥字节做加密的逻辑不匹配,必须显式将密钥转成对应编码的WordArray
- 编码对齐:原代码
encrypted.toString()默认输出Base64格式,和Golang端全Hex解码的逻辑冲突,必须显式将密文转成Hex字符串 - 参数错误:原解密代码配置项传了自定义的
ivEx字段,CryptoJS仅识别标准iv字段,导致IV不匹配解密失败 - 输出规范:显式指定IV转Hex输出,避免默认toString的格式不符合预期
注意事项
AES-256要求密钥长度为32字节,传入的secret字符串长度必须为32位(Utf8编码下单个字符占1字节的场景),否则Golang端会直接抛出密钥长度不匹配的错误。你提供的Golang端解密代码无需任何修改,可直接解密上述JS代码输出的加密字符串。
内容的提问来源于stack exchange,提问作者Sujit Baniya
相关产品推荐
相关产品推荐

