【问题标题】:Trying to understand Python's AES methods试图理解 Python 的 AES 方法
【发布时间】:2019-10-15 10:54:36
【问题描述】:

我希望,使用 Python3 的 Crypto.Cipher 在 CTR 模式下使用 AES。实际问题是我有一个二进制数字数组(字符串格式的“0/1”),并且我希望使用 AES-CTR 加密/解密它们。查看this 文章后,我尝试开发下面附加的代码。

from Crypto.Cipher import AES
import os
import sys

secret = os.urandom(16)
crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter=lambda: secret)

msg = "Hello World"

#string-->bytes
bytes_msg = str.encode(msg)
print(msg + " > 2bytes > " + str(bytes_msg))

#bytes-->encrypt
encrypted_bytes_msg = crypto.encrypt(bytes_msg)
print(" > encryption > " + str(encrypted_bytes_msg))

#encrypt-->decrypt
decrypted_bytes_msg = crypto.decrypt(encrypted_bytes_msg)
print(" > decryption > " + str(decrypted_bytes_msg))

#bytes-->string
#decrypted_msg = decrypted_bytes_msg.decode() # <= !ERROR HERE!
#print(" > msg > " + decrypted_msg)

期待看到如下内容:

Hello World > 2bytes > " b'Hello World' > 加密 > #JibberishText# > 解密 > b'Hello World' > Hello World

本次运行的实际结果是:

Hello World > 2bytes > b'Hello World' > 加密 > b'\x8eo\xfc`\xeck\xcf\r4\x1fS' > 解密 > b'\xc7\x93\x8a\x1dK\xad\xc5\ x9d8\x9c\x18'

另外:如果我不注释掉最后几行,我会收到以下错误:

文件“aes.py”,第 25 行,在 解密的_msg = 解密的_bytes_msg.decode() UnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0x8e:无效的起始字节

你能帮我理解模块的使用方法吗?

【问题讨论】:

  • 你在这里弄错了一些重要的东西。您的计数器永远不会增加,如果您要加密多个块,这将是一场灾难。您必须将密码重置为之前解密的初始状态,这意味着再次调用AES.new。而且您不能使用str.decode 从任意字节序列中创建字符串。检查任意字节序列值的最简单方法是在字节对象上调用hex() 方法。这些只是我在快速扫描中发现的错误。

标签: python-3.x cryptography aes pycryptodome


【解决方案1】:

您需要非常小心地使用此模块公开的原语,很容易做错事并彻底破坏密码系统

您的代码对我不起作用,因为 counter parameter should be a Crypto.Util.Counter 并且不起作用。这可能适用于某些版本的库,但它不适用于我。

也就是说,您的代码永远不会工作,因为您需要在加密和解密之间“重置”密码,以便在这些操作中使用相同的计数器值。第二个https://stackoverflow.com/a/45642256/1358308 对该问题的回答有一个更好的例子来说明如何使用该模块

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2022-07-06
    相关资源
    最近更新 更多