看板 java 關於我們 聯絡資訊
各位前輩 老師 同學 大家好 我這次寫的程式最後用到AES 加解密 過去三天 我一直卡在同一個地方 讓我有點兒崩潰 從android 送出加密後訊息 伺服器收到後 都會丟出 Input length must be multiple of 16 when decrypting with padded cipher 我參考到網路上的解法是 base64 或者 toHEX 字串來解決 我使用byteToHex來解決這個問題 但問題沒有解決 我有確定 客戶端跟伺服器皆算出同樣的一把session key 出問題的程式碼在下面 也標記了 出問題的一行程式碼 拜託 各位幫我看一下 我的盲點在哪...QAQ 再不行 我可能要試試看 在android 使用 Spongy Castle 在java server 使用 Bouncy Castle 了 ~"~ 先謝謝大家了 Orz 伺服器 部分程式碼 http://chopapp.com/#dommpgst android 部分程式碼 http://chopapp.com/#p1p6qrn3 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.74.127.208 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1397829643.A.4E2.html
PsMonkey:這,我到底是該刪還是不該刪... [攤手] 04/18 22:38
cyclone350:server程式:instruction 是什麼? Object[] 嗎? 04/18 23:29
janice001:收到的字串 [0] 放id [1] 放加解密的字串>< 04/18 23:31
cyclone350:看不懂,你說你使用byteToHex,我整份程式碼沒看到這個 04/18 23:33
cyclone350:既然註明是 hexToByte(instruction[1]); 這行錯,你沒 04/18 23:35
cyclone350:放hexToByte程式,也沒說明instruction,我們要怎麼看? 04/18 23:38
不好意思 本來就是這行程式碼出錯 我也用byteToHex 還有hexToByte 互解過 所以我覺得是對的 所以沒PO public static String bytesToHex(byte[] in) { final StringBuilder builder = new StringBuilder(); for(byte b : in) { builder.append(String.format("%02x", b)); } return builder.toString(); } public static byte[] hexToByte(String s) { return new BigInteger(s, 16).toByteArray(); } ※ 編輯: janice001 (111.252.192.242), 04/18/2014 23:47:43
cyclone350:hexToByte ... 輸入的 s 長度必須為16的倍數 04/19 00:31
cyclone350:剛剛亂測一下api,應該是key長度問題? 04/19 00:34
janice001:那我應該怎麼作 直接補0 嗎? 為什麼在Android底下 04/19 00:34
cyclone350:說錯了,不是Key,是加密結果長度必須為16的倍數? 04/19 00:37
Killercat:? 拿Cipher的時候就有參數要你填padding規則了啊 04/19 00:38
cyclone350:你在Android code底下的temp就是32位元了吧?你不是把 04/19 00:42
cyclone350:temp傳到server解密嗎? 更正,是長度為32 04/19 00:44
cyclone350:為什麼要補0? AES密文長度不是16的倍數嗎? 04/19 00:47
janice001:可是不知道為什麼傳過去就不是了...? 04/19 00:50
janice001:我檢查一下客戶端送出的東西 跟伺服器接到的東西好了 04/19 00:52
謝謝 cyclone350 的意見 檢查 長度之後發現訊息長度被更改 後來發現 Hex byte 之間的轉換是有問題的 已經成功加解密來回了 謝謝 >v< ※ 編輯: janice001 (111.252.192.242), 04/19/2014 02:21:01