我正在研究Python 3中的一个小项目。
我目前的问题是围绕基于AES的文件解密。文件(文本)的内容使用AES进行对称加密。
我导入了PyCrypto:https://www.dlitz.net/software/pycrypto/api/current/
关于对称密钥的文档很少:
key(byte string) - 在对称密码中使用的密钥。它必须是16(AES-128),24(AES-192)或32(AES-256)字节长。
我有钥匙,看起来像:
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. as byte-string:
key = b"0xB0,0x0D,0xDF,0x9D,..."
没效果。
有任何意见或想法吗?
最诚挚的问候, AFX
答案 0 :(得分:0)
你拥有的是十六进制字符串。例如,如果你有这个:
0x0F, 0x10, 0x1A
然后,将其浓缩为实际的十六进制字符串,为:
0F101A
作为原始字节,它是:
15, 16, 26
您只需要先将其转换为字节数组。看看binascii.unhexlify
。
答案 1 :(得分:0)
我想提供适合我的解决方案:
首先,获得基本知识:
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")
玩得开心。