刷新ug 2019-05-05 13:32 采纳率: 0%
浏览 439

AES用CBC解密后在ios端要么数据丢失,要么解密失败

后端JavaAES CBC方式加密json文件前端h5获取json进行解密,在Android下没问题数据解析正常,但是在ios有的机器数据解析出来丢失了一段。成了不完整的json串。有的机型直接解密失败。!!!!求大佬解救。

后端加密
加密

--

前端解密
前端解密

  • 写回答

1条回答 默认 最新

  • 一只小爪磕 新星创作者: 前端开发技术领域 2024-05-23 18:51
    关注

    本答案由爪磕协同GPT-4o回答,希望对您有所帮助 解决问题望采纳!


    在处理跨平台的AES CBC解密时,iOS端解密失败或者数据丢失,可能是由于编码、填充、或者数据处理方式不同导致的。以下是一些可能的解决方案:

    1. 确保编码一致

    确保在Java和前端(Vue.js使用CryptoJS)之间使用一致的编码方式。看起来你已经在Java端使用了StandardCharsets.UTF_8,在前端使用了CryptoJS.enc.Utf8,这应该是一致的。可以再确认一下解密前后数据的编码是否一致。

    2. 确保填充方式一致

    确保Java和CryptoJS使用相同的填充方式。Java代码中使用的是PKCS5Padding,而在JavaScript中使用的是CryptoJS.pad.Pkcs7。尽管PKCS5和PKCS7在AES中是等效的,但为了保险起见,可以尝试明确指定:

    padding: CryptoJS.pad.Pkcs7
    

    3. 确保IV的一致性

    确保IV在加密和解密中是一致的。你在前端代码中使用了一个硬编码的IV ('wwwminmetals@com'),确保这个IV在Java端加密时也是一致的。

    4. 修正Base64解码问题

    确保Base64编码和解码在Java和JavaScript中是一致的。不同的平台可能对于Base64的编码和解码有不同的实现方式,特别是在处理URL安全的Base64时。

    5. 检查解密后的数据处理

    前端代码中你在解密后进行了字符串分割和拼接操作,这可能会导致数据丢失或格式错误。尝试简化或改进这部分代码,确保解密后的数据完整。

    代码改进建议

    以下是改进后的代码示例:

    Java端加密代码

    private static String encrypt(String data, String key, String iv) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
        byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encrypted);
    }
    

    JavaScript端解密代码

    function AESdecode(word, pwd) {
        let key = CryptoJS.enc.Utf8.parse(pwd);
        let iv = CryptoJS.enc.Utf8.parse('wwwminmetals@com');
    
        let encryptedHexStr = CryptoJS.enc.Base64.parse(word);
        let decryptedData = CryptoJS.AES.decrypt(
            { ciphertext: encryptedHexStr },
            key,
            {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }
        );
    
        let decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
        console.log("解密后的数据: ", decryptedStr);
        try {
            let json = JSON.parse(decryptedStr);
            console.log("解密后的JSON: ", json);
        } catch (e) {
            console.error("JSON解析失败: ", e);
        }
    }
    

    6. 日志和错误处理

    在调试过程中,添加更多的日志和错误处理,以便更好地了解解密失败或数据丢失的具体原因。

    try {
        let decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
        console.log("解密后的数据: ", decryptedStr);
        let json = JSON.parse(decryptedStr);
        console.log("解密后的JSON: ", json);
    } catch (e) {
        console.error("解密或JSON解析失败: ", e);
    }
    

    7. 检查平台特有的问题

    iOS可能在处理某些字符编码上与Android有差异,确保你的数据在加密和解密过程中没有被错误处理或转换。

    通过以上步骤,应该可以定位并解决iOS端解密数据丢失或解密失败的问题。

    评论

报告相同问题?