试图理解 Python 的 AES 方法
Trying to understand Python's AES methods
我希望使用 Python3 的 Crypto.Cipher 在 CTR 模式下使用 AES。实际问题是我有一个二进制数字数组(字符串格式的“0/1”)并且我希望使用 AES-CTR encrypt/decrypt 它们。查看 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'
也:如果我不注释掉最后几行,我会得到以下错误:
File "aes.py", line 25, in
decrypted_msg = decrypted_bytes_msg.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte
你能帮我了解一下模块的使用方法吗?
你需要非常小心地使用这个模块公开的原语,很容易做错事并完全破坏密码系统
你的代码对我不起作用,因为 counter
parameter should be a Crypto.Util.Counter
而不是函数。这大概适用于某些版本的库,但它对我不起作用。
就是说,您的代码永远无法正常工作,因为您需要 "reset" 加密和解密之间的密码,以便在这些操作中使用相同的计数器值。该问题的第二个 答案有一个更好的如何使用模块的例子
我希望使用 Python3 的 Crypto.Cipher 在 CTR 模式下使用 AES。实际问题是我有一个二进制数字数组(字符串格式的“0/1”)并且我希望使用 AES-CTR encrypt/decrypt 它们。查看 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'
也:如果我不注释掉最后几行,我会得到以下错误:
File "aes.py", line 25, in decrypted_msg = decrypted_bytes_msg.decode() UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte
你能帮我了解一下模块的使用方法吗?
你需要非常小心地使用这个模块公开的原语,很容易做错事并完全破坏密码系统
你的代码对我不起作用,因为 counter
parameter should be a Crypto.Util.Counter
而不是函数。这大概适用于某些版本的库,但它对我不起作用。
就是说,您的代码永远无法正常工作,因为您需要 "reset" 加密和解密之间的密码,以便在这些操作中使用相同的计数器值。该问题的第二个 答案有一个更好的如何使用模块的例子