zoukankan      html  css  js  c++  java
  • 解决AES算法CBC模式加密字符串后再解密出现乱码问题

    问题

    在使用 AES CBC 模式加密字符串后,再进行解密,解密得到的字符串出现乱码情况,通常都是前几十个字节乱码;

    复现

    因为是使用部门 cgi AESEncryptUtil 库,找到问题后,在这里复现不太方便,这里使用 python 进行复现,可以方便复现。

    #!/usr/bin/env python 
    #coding=utf-8 
    from Crypto.Cipher import AES  
    
    PADDING = '' 
    
    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 对象。

  • 相关阅读:
    LintCode-Search for a Range
    LintCode-Serialization and Deserialization Of Binary Tree
    LeetCode-Reverse Words in a String
    LeetCode-Reorder List
    LeetCode-Word Break
    LeetCode-Word Ladder
    LeetCode-Valid Palindrome
    cf div2 237 D
    POJ 1759
    cf div2 238 D
  • 原文地址:https://www.cnblogs.com/cposture/p/9028892.html
Copyright © 2011-2022 走看看