使用 pycryptodome 解密 Python 256 AES
Decrypting Python 256 AES with pycryptodome
我有一个串口到 TCP 的设备,它通过 rs232 接收数据,加密数据,然后转发到 TCP 服务器。设备加密方法的文档几乎不存在,只有它的 128、192 或 256 位 AES 加密(可配置)。从文档中的其他一些上下文线索来看,我发现它可能使用 CBC 或 CFB 操作模式(尽管这也可能是错误的)。不,我不了解文档中 IV 的性质。也许它被添加到加密数据之前?
出于开发目的,我将相同的 RS232 数据发送到两个不同的设备:一个配置为加密数据,另一个配置为以明文形式发送。以下是明文和加密格式的相同数据。
明文:
b'\r\x00\nLocal: \r\x00\nACCESS by user 5 22:49:32 03/07/11\r\x00\n'
加密:
b'$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9'
密钥是 64 个十六进制字符(显然我会更改它):566B59703373367638792F423F4528482B4D6251655468576D5A713474377721
所以当我运行下面的代码反对它时,(尝试 CFB 和 CBC 模式)我没有得到任何人类可读的东西。
from Crypto.Cipher import AES
encrypted_data = b"$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9"
key = bytes.fromhex("566B59703373367638792F423F4528482B4D6251655468576D5A713474377721")
def decrypt(data, key):
print("Encrypted data: ", data)
#trying CFB mode
cipher = AES.new(key, AES.MODE_CFB)
pt = cipher.decrypt(data)
print("CFB mode outputs: ", pt)
#now trying CBC mode
#padding data per CBC requirements
length = 16 - (len(data) % 16)
data += bytes([length]) * length
cipher = AES.new(key, AES.MODE_CBC)
pt = cipher.decrypt(data)
print("CBC mode outputs: ", pt)
decrypt(encrypted_data, key)
输出:
Encrypted data: b'$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9'
CFB mode output: b'\xd3I\x95@[\xbeA\x15"W\xf4|\x7f\x93\x9d]\r\x10\xca\x9e\xc2\x9f\x8b\xfcDp :\x94\xdb\x85tS\xc4\xf4Lc\xe4\xa45\xa1{\x07\x0fOT\xbe\xe7u\x82\x8d\x01\x9a\x91A\xd6\x0f\x83\xe8\xf8\x80HP\x83 pu\xbaG\xae\xeb.\x9cTF\x17!\xa6\x0c) \xa8\xe7\x07\xf6J\'\xa7\xbc\x05\xcf\\x7f\x1a.\xe83n\xe2<\xb7\xe51\xdcZ\\x8b\xb2\xf2'
CBC mode output: b'\x8d\x1f\xaf@\x8c\xab\xb7\xf5\x1a}\x05b@\xcf\xd7L\xaa\xcc\x1a6\x82\xd3)\xee\xc2\x03\xc7\xe6k\x04P+\x0b>\xc1\x9d\xf5S\x0c\x17\xaf\xf6\x1dV\xe2\xa4\x0e\x98[\xdd\xcd6\xb6\xde,\x8f\xdfS\xc2\xc3h\xc7x\xee\x10IFM\xb0\x11K\xd87\xec\x86\xc8\xac\xff\xdb\t\x19i9\xa1\xbe\xf5\x153\xfdv)\x8d\x0b\x1e\x0e\xa7I!vb\xe4\x87X6\x14\xb0\x87D\xdc\x10\x7f\x98'
如何让此代码输出人类可读的内容?
任何意见将是有益的!谢谢!
-B
CFB是流密码模式,不需要padding。有不同的 CFB 变体,例如循环流化床 1、循环流化床 8、循环流化床 128。 CFB128也常被简称为CFB。
该数值描述了每个加密步骤加密的明文位数。
发布的密文可以用CFB128解密成功
在 PyCryptodome 中,数值由参数 segment_size
、here
指定
另外,加密后的数据中有16字节的IV放在前面(你已经猜到了),所以必须先把IV和实际密文分开。
以下代码解密密文:
from Crypto.Cipher import AES
encrypted_data = b"$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9"
key = bytes.fromhex("566B59703373367638792F423F4528482B4D6251655468576D5A713474377721")
def decrypt(data, key):
#print("Encrypted data: ", data)
iv = data[:16] # Separate IV
ciphertext = data[16:] # and actual ciphertext
#trying CFB mode
cipher = AES.new(key, AES.MODE_CFB,iv=iv,segment_size=128) # Specify CFB128
pt = cipher.decrypt(ciphertext)
print("CFB mode outputs: ", pt)
decrypt(encrypted_data, key)
输出:
CFB mode outputs: b'\r\nLocal: \r\nACCESS by user 5 22:49:32 03/07/11\r\n'
我有一个串口到 TCP 的设备,它通过 rs232 接收数据,加密数据,然后转发到 TCP 服务器。设备加密方法的文档几乎不存在,只有它的 128、192 或 256 位 AES 加密(可配置)。从文档中的其他一些上下文线索来看,我发现它可能使用 CBC 或 CFB 操作模式(尽管这也可能是错误的)。不,我不了解文档中 IV 的性质。也许它被添加到加密数据之前?
出于开发目的,我将相同的 RS232 数据发送到两个不同的设备:一个配置为加密数据,另一个配置为以明文形式发送。以下是明文和加密格式的相同数据。
明文:
b'\r\x00\nLocal: \r\x00\nACCESS by user 5 22:49:32 03/07/11\r\x00\n'
加密:
b'$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9'
密钥是 64 个十六进制字符(显然我会更改它):566B59703373367638792F423F4528482B4D6251655468576D5A713474377721
所以当我运行下面的代码反对它时,(尝试 CFB 和 CBC 模式)我没有得到任何人类可读的东西。
from Crypto.Cipher import AES
encrypted_data = b"$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9"
key = bytes.fromhex("566B59703373367638792F423F4528482B4D6251655468576D5A713474377721")
def decrypt(data, key):
print("Encrypted data: ", data)
#trying CFB mode
cipher = AES.new(key, AES.MODE_CFB)
pt = cipher.decrypt(data)
print("CFB mode outputs: ", pt)
#now trying CBC mode
#padding data per CBC requirements
length = 16 - (len(data) % 16)
data += bytes([length]) * length
cipher = AES.new(key, AES.MODE_CBC)
pt = cipher.decrypt(data)
print("CBC mode outputs: ", pt)
decrypt(encrypted_data, key)
输出:
Encrypted data: b'$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9'
CFB mode output: b'\xd3I\x95@[\xbeA\x15"W\xf4|\x7f\x93\x9d]\r\x10\xca\x9e\xc2\x9f\x8b\xfcDp :\x94\xdb\x85tS\xc4\xf4Lc\xe4\xa45\xa1{\x07\x0fOT\xbe\xe7u\x82\x8d\x01\x9a\x91A\xd6\x0f\x83\xe8\xf8\x80HP\x83 pu\xbaG\xae\xeb.\x9cTF\x17!\xa6\x0c) \xa8\xe7\x07\xf6J\'\xa7\xbc\x05\xcf\\x7f\x1a.\xe83n\xe2<\xb7\xe51\xdcZ\\x8b\xb2\xf2'
CBC mode output: b'\x8d\x1f\xaf@\x8c\xab\xb7\xf5\x1a}\x05b@\xcf\xd7L\xaa\xcc\x1a6\x82\xd3)\xee\xc2\x03\xc7\xe6k\x04P+\x0b>\xc1\x9d\xf5S\x0c\x17\xaf\xf6\x1dV\xe2\xa4\x0e\x98[\xdd\xcd6\xb6\xde,\x8f\xdfS\xc2\xc3h\xc7x\xee\x10IFM\xb0\x11K\xd87\xec\x86\xc8\xac\xff\xdb\t\x19i9\xa1\xbe\xf5\x153\xfdv)\x8d\x0b\x1e\x0e\xa7I!vb\xe4\x87X6\x14\xb0\x87D\xdc\x10\x7f\x98'
如何让此代码输出人类可读的内容? 任何意见将是有益的!谢谢!
-B
CFB是流密码模式,不需要padding。有不同的 CFB 变体,例如循环流化床 1、循环流化床 8、循环流化床 128。 CFB128也常被简称为CFB。
该数值描述了每个加密步骤加密的明文位数。
发布的密文可以用CFB128解密成功
在 PyCryptodome 中,数值由参数 segment_size
、here
另外,加密后的数据中有16字节的IV放在前面(你已经猜到了),所以必须先把IV和实际密文分开。
以下代码解密密文:
from Crypto.Cipher import AES
encrypted_data = b"$+\xf5Sq\x1aBC\xbe\t\x8f2\x0b\xf9\xdc!\x80By2\xbb\x10k\x03G\xbb\x85\xd5u\x1dM\xeb\xfd\xa8\xf4\xa13GX|\x06\x0e\xa7K\x0f\xbc\xca\x82js)Q\xff\xbc\xbd\xe2\x05mfJ\xe7g\xdc\xd3b\xff_O\xaeNDH\xb4\x8e\xb7\xbf\xba\xe6\xd1\x1bu\n\xe2\x05\xae\x1a\xfc\xd7v\x06\xe6/^&v\xd4\x1a-\x0f\x16o\xc7\xeb\xc4\x90h\xe9"
key = bytes.fromhex("566B59703373367638792F423F4528482B4D6251655468576D5A713474377721")
def decrypt(data, key):
#print("Encrypted data: ", data)
iv = data[:16] # Separate IV
ciphertext = data[16:] # and actual ciphertext
#trying CFB mode
cipher = AES.new(key, AES.MODE_CFB,iv=iv,segment_size=128) # Specify CFB128
pt = cipher.decrypt(ciphertext)
print("CFB mode outputs: ", pt)
decrypt(encrypted_data, key)
输出:
CFB mode outputs: b'\r\nLocal: \r\nACCESS by user 5 22:49:32 03/07/11\r\n'