【问题标题】:AES-128 CBC encryption in pythonpython中的AES-128 CBC加密
【发布时间】:2021-06-25 23:10:02
【问题描述】:

我正在尝试摆脱下面的 openssl 调用并将其替换为纯 python 代码。

import os
    
iv = "7bde5a0f3f39fd658efc45de143cbc94"
password = "3e83b13d99bf0de6c6bde5ac5ca4ae68"
msg = "this is a message"

out = os.popen(f'printf "{msg}" | openssl aes-128-cbc -base64 -K {password} -iv {iv}').read()

print(f"IV: {iv}")    
print(f"PWD: {password}")     
print(f"MSG: {msg}")   
print(f"OUT: {out}")   

产量:

IV: 7bde5a0f3f39fd658efc45de143cbc94
PWD: 3e83b13d99bf0de6c6bde5ac5ca4ae68
MSG: this is a message
OUT: ukMTwxkz19qVPiwU8xa/YM9ENqklbZtB86AaVPULHLE=

在人们似乎建议的 3 个不同的库和似乎不再起作用的各种其他代码摘录之间,我无法在纯 python 中可靠地复制它。有人有上述的工作代码示例吗?

【问题讨论】:

    标签: python openssl cryptography aes pycrypto


    【解决方案1】:

    使用 Python3,您可以使用 PyCryptodomebinasciibase64

    from base64 import b64encode, b64decode
    from binascii import unhexlify
    
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    
    iv = "7bde5a0f3f39fd658efc45de143cbc94"
    password = "3e83b13d99bf0de6c6bde5ac5ca4ae68"
    msg = "this is a message"
    
    print(f"IV: {iv}")
    print(f"PWD: {password}")
    print(f"MSG: {msg}")
    
    # Convert Hex String to Binary
    iv = unhexlify(iv)
    password = unhexlify(password)
    
    # Pad to AES Block Size
    msg = pad(msg.encode(), AES.block_size)
    # Encipher Text
    cipher = AES.new(password, AES.MODE_CBC, iv)
    cipher_text = cipher.encrypt(msg)
    
    # Encode Cipher_text as Base 64 and decode to String
    out = b64encode(cipher_text).decode('utf-8')
    print(f"OUT: {out}")
    
    # Decipher cipher text
    decipher = AES.new(password, AES.MODE_CBC, iv)
    # UnPad Based on AES Block Size
    plaintext = unpad(decipher.decrypt(b64decode(out)), AES.block_size).decode('utf-8')
    print(f'PT: {plaintext}')
    

    你可以看到更多:

    1. AES-128 CBC decryption in Python
    2. Python Encrypting with PyCrypto AES

    【讨论】:

    • 感谢您的回答。但是,当我运行您的代码时,它似乎与我的原始代码生成的 openssl 输出不匹配:ukMTwxkz19qVPiwU8xa/YM9ENqklbZtB86AaVPULHLE= - 你知道这是为什么吗?
    • 是的。您将 -base64 指定为标志(对于在我最初提出解决方案时错过它表示歉意)。您可以from base64 import b64encode 而不是对 cipher_text 进行 hexlifying,您可以b64encode(cipher_text).decode('utf-8') 来获得您期望的字符串。 *我已更新我的解决方案以反映这一变化。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2013-08-11
    • 2019-08-17
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多