gpt4 book ai didi

python - 从 OpenSSL AES 在 python 中解密 AES CBC

转载 作者:行者123 更新时间:2023-12-03 16:32:33 30 4
gpt4 key购买 nike

我需要使用 python 解密在 OpenSSL 上加密的文件,但我不了解 pycrypto 的选项。
这是我在 OpenSSL 中所做的

  • openssl enc -aes-256-cbc -a -salt -pbkdf2 -iter 100000 -in "clear.txt"-out "crypt.txt"-pass pass:"mypassword"
  • openssl enc -d -aes-256-cbc -a -pbkdf2 -iter 100000 -in "crypt.txt"-out "out.txt"-pass pass:"mypassword"

  • 我试过了(这显然行不通)
    obj2 = AES.new("mypassword", AES.MODE_CBC)
    output = obj2.decrypt(text)
    我只想在python中做第二步,但是在查看示例时:
    https://pypi.org/project/pycrypto/
    obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
    obj2.decrypt(ciphertext)
    我不需要IV,我如何指定盐? pbkdf2 哈希?我也在看这个线程
    How to decrypt OpenSSL AES-encrypted files in Python?
    但没有帮助。
    有人可以告诉我如何使用 python 做到这一点吗?
    谢谢你。

    最佳答案

    OpenSSL 语句使用 PBKDF2 创建一个 32 字节的 key 和一个 16 字节的 IV。为此,隐式生成随机 8 字节盐并应用指定的密码、迭代计数和摘要(默认值:SHA-256)。 key /IV 对用于在 CBC 模式和 PKCS7 填充中使用 AES-256 加密明文,s。 here .结果以OpenSSL格式返回,以Salted__的8字节ASCII编码开头,后面是8字节salt和实际密文,都是Base64编码的。解密需要salt,这样才能重建key和IV。
    请注意,OpenSSL 语句中的密码实际上是不带引号传递的,即在发布的 OpenSSL 语句中,引号是密码的一部分。
    对于 Python 中的解密,必须首先从加密数据中确定盐和实际密文。使用盐,可以重建 key /IV 对。最后, key /IV 对可用于解密。
    示例:使用发布的 OpenSSL 语句,明文

    The quick brown fox jumps over the lazy dog
    被加密成密文
    U2FsdGVkX18A+AhjLZpfOq2HilY+8MyrXcz3lHMdUII2cud0DnnIcAtomToclwWOtUUnoyTY2qCQQXQfwDYotw== 
    可以使用 Python 进行解密,如下所示(使用 PyCryptodome):
    from Crypto.Protocol.KDF import PBKDF2
    from Crypto.Hash import SHA256
    from Crypto.Util.Padding import unpad
    from Crypto.Cipher import AES
    import base64

    # Determine salt and ciphertext
    encryptedDataB64 = 'U2FsdGVkX18A+AhjLZpfOq2HilY+8MyrXcz3lHMdUII2cud0DnnIcAtomToclwWOtUUnoyTY2qCQQXQfwDYotw=='
    encryptedData = base64.b64decode(encryptedDataB64)
    salt = encryptedData[8:16]
    ciphertext = encryptedData[16:]

    # Reconstruct Key/IV-pair
    pbkdf2Hash = PBKDF2(b'"mypassword"', salt, 32 + 16, count=100000, hmac_hash_module=SHA256)
    key = pbkdf2Hash[0:32]
    iv = pbkdf2Hash[32:32 + 16]

    # Decrypt with AES-256 / CBC / PKCS7 Padding
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(ciphertext), 16)

    print(decrypted)
    编辑 - 关于您的评论: 16 MB 应该是可能的,但对于较大的数据,通常会从文件中读取密文,并将解密的数据写入文件,这与上面发布的示例相反。
    数据能否一步解密,最终取决于可用内存。如果内存不够,必须分块处理数据。
    使用块时,最好不要对加密数据进行 Base64 编码,而是直接以二进制格式存储它们。这可以通过省略 OpenSSL 语句中的 -a 选项来实现。否则必须确保总是加载块大小的整数倍(相对于未解码密文),其中未解码密文的 3 个字节对应于 Base64 编码密文的 4 个字节。
    在二进制存储密文的情况下:在解密期间,在第一步中只应(二进制)读取第一个块(16 个字节)。由此,可以确定盐(字节 8 到 16),然后是 key 和 IV(类似于上面发布的代码)。
    密文的其余部分可以(二进制)以合适大小的块(= 块大小的倍数,例如 1024 字节)读取。每个块单独加密/解密,见 multiple encrypt/decrypt-calls .要使用 Python 以块的形式读取/写入文件,请参见例如 here .更多细节最好在单独问题的范围内回答。

    关于python - 从 OpenSSL AES 在 python 中解密 AES CBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64126653/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com