Python 3DES CBC 模式加密解密


3DES 加密

    def des3_cbc_encrypt(secret_key, secret_value, iv):
        """
        3DES CBC 加密算法
        :param secret_key: 加密的密鑰長度24位,不足補0,超過24位,截取前24位
        :param secret_value:加密串不是8的倍數,用空格補全成8的倍數
        :param iv: 長度為8偏移量
        :return:
        """
        length = DES3.block_size
        secret_value = secret_value + (length - len(secret_value) % length) * chr(length - len(secret_value) % length)
        if len(secret_key) > 24:  # 長度大於24 截取前24位
            secret_key = secret_key[0:24]
        else:  # 不足24位進行0補全
            secret_key = secret_key + '\0' * (24 - len(secret_key) % 24)
        res = DES3.new(secret_key.encode("utf-8"), DES3.MODE_CBC, iv)
        ciphertext = res.encrypt(secret_value.encode("utf-8"))
        return base64.b64encode(ciphertext).decode("utf-8")

  加密中文時,如果先將加密字符串補齊8的倍數,再次加密時轉成字節以后長度就會不等於8的倍數,因為utf-8編碼一個漢字占三個字節導致,所以補全時需要先轉碼再去判斷是否需要補全;

  將上述代碼優化為

    def des3_cbc_encrypt(secret_key, secret_value, iv):
        """
        3DES CBC 加密算法
        :param secret_key: 加密的密鑰長度24位,不足補0,超過24位,截取前24位
        :param secret_value:加密串不是8的倍數,用空格補全成8的倍數
        :param iv: 長度為8偏移量
        :return:
        """
        length = DES3.block_size
        print(len(secret_value.encode("utf-8")))
        encode_secret_value = secret_value.encode("utf-8")  # 先編碼再次去判斷是否補全
        secret_value = secret_value + (length - len(encode_secret_value) % length) * chr(
            length - len(encode_secret_value) % length)
        if len(secret_key) > 24:  # 長度大於24 截取前24位
            secret_key = secret_key[0:24]
        else:  # 不足24位進行0補全
            secret_key = secret_key + '\0' * (24 - len(secret_key) % 24)
        res = DES3.new(secret_key.encode("utf-8"), DES3.MODE_CBC, iv)
        ciphertext = res.encrypt(secret_value.encode("utf-8"))
        return base64.b64encode(ciphertext).decode("utf-8")

3DES解密

    def des3_cbc_decrypt(secret_key, secret_value, iv):
        """
        3DES CBC 解密算法
        :param secret_key: 加密的密鑰長度24位,不足補0,超過24位,截取前24位
        :param secret_value:加密串不是8的倍數,用空格補全成8的倍數
        :param iv: 長度為8偏移量
        :return:
        """
        unpad = lambda s: s[0:-ord(s[-1])]
        if len(secret_key) > 24:
            secret_key = secret_key[0:24]
        else:
            secret_key = secret_key + '\0' * (24 - len(secret_key) % 24)
        res = DES3.new(secret_key.encode("utf-8"), DES3.MODE_CBC, iv)
        base64_decrypted = base64.b64decode(secret_value.encode("utf-8"))
        encrypt_text = res.decrypt(base64_decrypted)
        result = unpad(encrypt_text.decode())return result

 注意:

  iv 需要轉換成字節或者字節數組

#  轉換成字節數組
bytearray([1, 2, 3, 4, 5, 9, 7, 8])
#  轉換成字節
第①種
s =b"1234567890"
第②種
bytes("1234567890", encoding="utf8") 
第③種
"1234567890".encode("utf8")

 


免責聲明!

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



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