这是AES Key的有效字节字符串吗?

时间:2018-04-20 15:19:52

标签: python-3.x encryption utf-8 ascii decoding

我正在研究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

所以我试过了两个:

  1. 初始化为字符串:
  2. key = "0xB0,0x0D,0xDF,0x9D,..."

    和2. as byte-string:

    key = b"0xB0,0x0D,0xDF,0x9D,..."

    没效果。

    有任何意见或想法吗?

    最诚挚的问候, AFX

2 个答案:

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

玩得开心。