这是 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

所以我都试过了:

  1. 初始化为字符串:

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")

玩得开心。