这是 AES 密钥的有效字节字符串吗?
Is this a valid byte string for AES Key?
我正在 Python 3.
做一个小项目
我当前的问题是基于 AES 的文件解密。文件内容(文本)采用 AES 对称加密。
我已经导入了 PyCrypto:https://www.dlitz.net/software/pycrypto/api/current/
文档中关于对称密钥的细节很少:
key (byte string) - The secret key to use in the symmetric cipher. It must be 16 (AES-128), 24 (AES-192), or 32 (AES-256) bytes long.
我有钥匙,看起来像:
0xB0,0x0D,0xDF,0x9D,...
(出于安全原因我没有在这里报告完整的密钥)
无论如何,我的第一个问题:
那是什么字符串?它看起来像 ASCII,但我缺乏对编码的深入了解。我需要任何类型的转换/解码吗?
我写了一个小程序来打开文件并解密。但是 PyCrypto 抛出一个错误,我现在花了 5 个小时反复试验,没有任何进展:
ValueError: AES key must be either 16, 24, or 32 bytes long
所以我都试过了:
- 初始化为字符串:
key = "0xB0,0x0D,0xDF,0x9D,..."
和 2. 作为字节串:
key = b"0xB0,0x0D,0xDF,0x9D,..."
没有效果。
有什么意见或想法吗?
此致,
AFX
你得到的是一个十六进制字符串。例如,如果你有这个:
0x0F, 0x10, 0x1A
然后这个,浓缩成一个实际的十六进制字符串,是:
0F101A
其中,作为原始字节,是:
15, 16, 26
您只需要先将其转换为字节数组即可。看看 binascii.unhexlify
.
我想提供适合我的解决方案:
首先,了解基础知识:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = 'insert-key-here'
现在,我构建一个解密方法:
def decrypt_file(key, in_filename, out_filename=None):
""" Decrypts a file using AES (CBC mode) with the
given key.
"""
backend = default_backend()
with open(in_filename, mode="r+b") as infile:
iv = infile.read(16) #Calling .read() will move the iterator exactly as many positions
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
decryptor = cipher.decryptor()
with open(out_filename, mode="w+b") as outfile:
cipher_text = infile.read() #Only the first 16byte are the iv, the rest is the cipher-text
outfile.write(decryptor.update(cipher_text) + decryptor.finalize())
这是密钥:我必须先将密钥转换为字节串
#Transform key to byte-string
key_int = [int(x,0) for x in key.split(',')]
decrypt_byte_key = b''
for x in key_int:
decrypt_byte_key += x.to_bytes(1, 'little')
最后,您可以运行将其添加到您的文件中:
decrypt_file(decrypt_byte_key, "input.enc", "output.txt")
玩得开心。
我正在 Python 3.
做一个小项目我当前的问题是基于 AES 的文件解密。文件内容(文本)采用 AES 对称加密。
我已经导入了 PyCrypto:https://www.dlitz.net/software/pycrypto/api/current/
文档中关于对称密钥的细节很少:
key (byte string) - The secret key to use in the symmetric cipher. It must be 16 (AES-128), 24 (AES-192), or 32 (AES-256) bytes long.
我有钥匙,看起来像:
0xB0,0x0D,0xDF,0x9D,...
(出于安全原因我没有在这里报告完整的密钥)
无论如何,我的第一个问题:
那是什么字符串?它看起来像 ASCII,但我缺乏对编码的深入了解。我需要任何类型的转换/解码吗?
我写了一个小程序来打开文件并解密。但是 PyCrypto 抛出一个错误,我现在花了 5 个小时反复试验,没有任何进展:
ValueError: AES key must be either 16, 24, or 32 bytes long
所以我都试过了:
- 初始化为字符串:
key = "0xB0,0x0D,0xDF,0x9D,..."
和 2. 作为字节串:
key = b"0xB0,0x0D,0xDF,0x9D,..."
没有效果。
有什么意见或想法吗?
此致, AFX
你得到的是一个十六进制字符串。例如,如果你有这个:
0x0F, 0x10, 0x1A
然后这个,浓缩成一个实际的十六进制字符串,是:
0F101A
其中,作为原始字节,是:
15, 16, 26
您只需要先将其转换为字节数组即可。看看 binascii.unhexlify
.
我想提供适合我的解决方案:
首先,了解基础知识:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = 'insert-key-here'
现在,我构建一个解密方法:
def decrypt_file(key, in_filename, out_filename=None):
""" Decrypts a file using AES (CBC mode) with the
given key.
"""
backend = default_backend()
with open(in_filename, mode="r+b") as infile:
iv = infile.read(16) #Calling .read() will move the iterator exactly as many positions
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
decryptor = cipher.decryptor()
with open(out_filename, mode="w+b") as outfile:
cipher_text = infile.read() #Only the first 16byte are the iv, the rest is the cipher-text
outfile.write(decryptor.update(cipher_text) + decryptor.finalize())
这是密钥:我必须先将密钥转换为字节串
#Transform key to byte-string
key_int = [int(x,0) for x in key.split(',')]
decrypt_byte_key = b''
for x in key_int:
decrypt_byte_key += x.to_bytes(1, 'little')
最后,您可以运行将其添加到您的文件中:
decrypt_file(decrypt_byte_key, "input.enc", "output.txt")
玩得开心。