[轉]Crypto-JS AES 報錯 Malformed UTF-8 data 的解決


原文鏈接 https://blog.csdn.net/qq_34963080/article/details/89742520

遇到這個問題,正好搜到這篇文章,記錄一下

 

開發中,需要加密返回的json格式敏感數據,不方便讓它明文傳輸。所以參考https://www.jianshu.com/p/34c15b8d025a 文章,匹合java端,前端用Crypto-JS實現。但是在解密時,報了錯 Malformed UTF-8 data 。

遇到問題,第一步干嘛?百度。(因為英文不好,還不會用google,每當這個時候,我有種重修英文的願望,礙於工作較忙,或者什么甚它原因,遲遲沒有行動,非常慚愧)

百度這個問題的結果,大多是說,要base64再編碼,解碼前先進行一次base64解碼。試了,問題依舊。

第二步,怎么辦?放棄?還是自己想辦法?當然不能輕言放棄。

於是想debug Crypto-JS 的執行過程。因為aes.js是壓縮過的,所以先將aes.js用格式化,debug到拋出異常前的b.stringify(a)返回值就是亂碼了,decodeURIComponent(escape(b.stringify(a))) 解碼過程中拋出的異常Malformed UTF-8 data 。

為什么java測試中,解密就沒有問題呢?

debug到aes.js解析代碼:
 

parse: function(d) {
            var l = d.length,
                s = this._map,
                t = s.charAt(64);
            t && (t = d.indexOf(t), -1 != t && (l = t));
            for (var t = [], r = 0, w = 0; w < l; w++) if (w % 4) {
                var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4),
                    b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4);
                t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4);
                r++
            }
            return p.create(t, r)
        },
        _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

 

這里的d,就是要解密的字符串,這里,它跟依據_map做的解析。於是想到,要解密的字符串里,是不是包含了_map定義之外的字符啊?大致看了下,沒有特殊的字符。但是發現它非常整潔,每行長度都是一致的,應該是換行了。於是del鍵去除每行的換行科符,測試,總算可以了。

 

原因:java Cipher aes 加密調用return new sun.misc.BASE64Encoder().encode(encrypted);輸出的時候,每57個字符進行了換行。

protected int bytesPerLine() {
return 57;
}
解決辦法:去除換行符,代碼如下。

String encrypt = ...;//這里是加密工具類返回的字符串
encrypt = encrypt.replaceAll(System.lineSeparator(), "");//將換行符替換為空

return encrypt;
————————————————
版權聲明:本文為CSDN博主「藍兔子_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34963080/article/details/89742520


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM