1. 程式人生 > >Android AES加密報錯處理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

Android AES加密報錯處理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

xxxxx 說明 openssl length 技術分享 可能 而不是 com bsp

一、問題說明

今天寫AES加/解密功能的apk,設想是四個控件(測試用的,界面醜這種東西請忽略)

一個編緝框----用於輸入要加密的字符串

一個文本框----用於輸出加密後的字符串,和加密後點擊解密按鈕時解密後的字符串

一個加密按鈕----點擊後進行加密

一個解密按鈕----點擊後進行解密

界面如下:

技術分享圖片

點擊加密沒有問題,但再點擊解密的時候一直報錯:“W/System.err: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH”

技術分享圖片

二、報錯追蹤

因為用於加解密的類是大學時密碼學大作業用過的,基本確定不會有問題,所以將問題確定在傳過去的參數有問題上。

2.1 toString()錯誤使用

首先觀察發現無論加密字符串內容和長度如何改變,加密的結果總是"[B@xxxxxx"的形式,如下圖所示

技術分享圖片

這肯定是有問題的----AES作為高強度的加密算法加密內容改變後加密結果開頭還是一樣這是不可能的,對稱加密加密結果長度不隨加密內容長短變化這也是不可能的。

加解密按鈕點擊事件響應代碼如下:

技術分享圖片

調試可以看到"[B@xxxxxx"更類似於byte[]的id,而不是其內容

技術分享圖片

也就是說,想使用byte_encrypt_result.toString()將byte[]轉成String,雖然看起來本該如此但實際上是行不通的。

2.2 byte[]轉String再轉byte[]內容發生改變引起錯誤

toString()不能用,然後看到這位小哥哥說可以通過new String(byte[]),文章寫得很清晰一看就是高手我是很相信他的。所以代碼就改成了下邊這個樣子

技術分享圖片

加密結果是一堆亂碼,很好,這就是我們想要的

技術分享圖片

但是點擊解密,依然一樣報錯“W/System.err: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH”

代碼邏輯看起來完全沒有問題,怎麽還會報錯呢。經過反復調試觀察到,解密時獲取的byte_encrypt_result內容和長度完全不一樣(在前面是byte[16]這裏變成了byte[28])

技術分享圖片

也就是說,在new String(byte[])到toString().getBytes()再取回byte[]這個過程中,byte[]內容發生了變化

百度“byte[]轉string再轉回byte[]”,看到好像說new String()默認使用UTF-8編碼getBytes()默認使用ISO8859-1編碼引發了問題,指定new String()和getBytes()統一使用ISO8859-1即可解決問題。(我覺得java的編碼問題是相當令人頭疼的,尤其在讀寫文件和網絡通信上,問題能解決就好實在不想深究)

所以最終代碼如下:

技術分享圖片

程序成功解密:

技術分享圖片

Android AES加密報錯處理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH