原文鏈接 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