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

1、問題說明

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

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

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

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

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

界面以下:編碼

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

 

2、報錯追蹤

由於用於加解密的類是大學時密碼學大做業用過的,基本肯定不會有問題,因此將問題肯定在傳過去的參數有問題上。spa

2.1 toString()錯誤使用

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

這確定是有問題的----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的編碼問題是至關使人頭疼的,尤爲在讀寫文件和網絡通訊上,問題能解決就好實在不想深究)

因此最終代碼以下:

程序成功解密:

相關文章
相關標籤/搜索