import CryptoJS from 'crypto-js'; import overAllConfig from '@/config.js' /** * AES-CBC 解密(从 Base64 中提取随机 IV) * @param {string} base64Str - 加密后的 Base64 字符串(IV + 密文) * @param {string} keyStr - 16 字节密钥字符串 * @returns {string} 解密后的明文 */ export function decryptJson(encryptedBase64, base64Key = overAllConfig.AESKey) { try { // 1. Base64 解码密钥 & 数据 const key = CryptoJS.enc.Base64.parse(base64Key); const combinedData = CryptoJS.enc.Base64.parse(encryptedBase64); // 2. 提取 IV(前16字节 = 4 个 32bit Word) const ivWords = combinedData.words.slice(0, 4); const iv = CryptoJS.lib.WordArray.create(ivWords, 16); // 3. 提取密文(剩余部分) const ciphertextWords = combinedData.words.slice(4); const ciphertext = CryptoJS.lib.WordArray.create( ciphertextWords, combinedData.sigBytes - 16 ); // 4. 解密 const decrypted = CryptoJS.AES.decrypt({ ciphertext }, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, // 等价于 Java 的 PKCS5Padding }); const result = decrypted.toString(CryptoJS.enc.Utf8); if (!result) throw new Error('解密失败,返回空字符串(可能密钥错误或格式错误)'); return result; } catch (e) { console.error('解密失败:', e); return ''; } }