解決AES算法CBC模式加密字符串后再解密出現亂碼問題


問題

在使用 AES CBC 模式加密字符串后,再進行解密,解密得到的字符串出現亂碼情況,通常都是前幾十個字節亂碼;

復現

因為是使用部門 cgi AESEncryptUtil 庫,找到問題后,在這里復現不太方便,這里使用 python 進行復現,可以方便復現。

#!/usr/bin/env python 
#coding=utf-8 
from Crypto.Cipher import AES  

PADDING = '\0' 

if __name__ == "__main__":  
    pad_it = lambda s: s+(16 - len(s)%16)*PADDING  
    key = '0123456789abcdef'  
    data = pad_it('luffichen0123456789abcdef') 
    aes_util = AES.new(key, AES.MODE_CBC, b'0000000000000000') 
    crypt = aes_util.encrypt(data) 
    print(base64.b64decode(crypt))
    print(data) 
    # 使用同一個 aes_util 會導致亂碼 
    recovery = aes_util.decrypt(crypt) 
    print(recovery)

輸出結果:

結論

在 CBC 模式,同個AES對象,所有之前的加解密會影響下一次加解密(加密解密誰先誰后影響都一樣),因為 CBC 是 Block chained 的,加密的時候是串行的,需要依賴上個塊的加解密結果,可以理解為它是有記錄中間狀態的過程,所以下一次加解密使用原來的 AES 對象存在問題;ECB模式則沒有這個問題;詳細可以看 wiki:https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

解決方法

每次加解密都需要重新生成一個 AES 對象。


免責聲明!

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



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