Python3 PyCrypto 在解密长消息时产生 Valueerror
Python3 PyCrypto produce a Valueerror when decrypt long message
嗨,
我必须用 DES 和 XOR 解密 DES 加密的消息。
当我解密一条 24 字节长的消息时,它运行正确。
但是对于 40 字节或更多字节,会产生这样的错误:
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/XOR.py", line 80, in new
return XORCipher(key, *args, **kwargs)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/XOR.py", line 44, in __init__
self._cipher = _XOR.new(key, *args, **kwargs)
ValueError: XOR key must be no longer than 32 bytes
我用这个代码加密消息:
def like_3DES_encrypt(message_bytes, key_16bytes_hex):
blocksize = 8
data_b_pad = appendBitPadding(message_bytes, 8)
key_b = bytes.fromhex(BitArray(hex=key_16bytes_hex).hex)
iv = bytes.fromhex(BitArray(hex='0000000000000000').hex)
# split the key on half size
key_1_b = key_b[:8]
key_2_b = key_b[8:16]
result = b''
for i in range(0, len(data_b_pad), blocksize):
block = data_b_pad[i:i+blocksize]
if i > 0:
result0 = XOR.new(result3).encrypt(block)
else:
result0 = block
result1 = DES.new(key_1_b, DES.MODE_CBC, iv).encrypt(result0)
result2 = DES.new(key_2_b, DES.MODE_CBC, iv).decrypt(result1)
result3 = DES.new(key_1_b, DES.MODE_CBC, iv).encrypt(result2)
result += result3
return result
加密没有错误。
但是当我尝试使用此代码解密加密消息时:
def like_3DES_decrypt(message_bytes, key_16bytes_hex):
blocksize = 8
key_b = bytes.fromhex(BitArray(hex=key_16bytes_hex).hex)
iv = bytes.fromhex(BitArray(hex='0000000000000000').hex)
# split the key on half size
key_1_b = key_b[:8]
key_2_b = key_b[8:16]
result = b''
for i in range(len(message_bytes), 0, - blocksize):
block = message_bytes[i-blocksize:i]
result1 = DES.new(key_1_b, DES.MODE_CBC, iv).decrypt(block)
result2 = DES.new(key_2_b, DES.MODE_CBC, iv).encrypt(result1)
result3 = DES.new(key_1_b, DES.MODE_CBC, iv).decrypt(result2)
if i > blocksize:
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
else:
result4 = result3
result = result4 + result
result = removeBitPadding(result)
return result
我解密长消息有什么问题?
谢谢
错误消息 ValueError: XOR key must be no longer than 32 bytes
告诉您不能使用大于 32 字节的密钥初始化 XOR 对象。通过检查 source code,您可以看到这是在第 61 行强制执行的。要使用更大的密钥执行异或运算,您需要不同的实现。
你的线路
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
虽然看起来有点奇怪,也许你已经用密钥交换了消息:
result4 = XOR.new(result3).encrypt(message_bytes[i-(blocksize*2):-blocksize])
嗨,
我必须用 DES 和 XOR 解密 DES 加密的消息。
当我解密一条 24 字节长的消息时,它运行正确。
但是对于 40 字节或更多字节,会产生这样的错误:
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/XOR.py", line 80, in new
return XORCipher(key, *args, **kwargs)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/XOR.py", line 44, in __init__
self._cipher = _XOR.new(key, *args, **kwargs)
ValueError: XOR key must be no longer than 32 bytes
我用这个代码加密消息:
def like_3DES_encrypt(message_bytes, key_16bytes_hex):
blocksize = 8
data_b_pad = appendBitPadding(message_bytes, 8)
key_b = bytes.fromhex(BitArray(hex=key_16bytes_hex).hex)
iv = bytes.fromhex(BitArray(hex='0000000000000000').hex)
# split the key on half size
key_1_b = key_b[:8]
key_2_b = key_b[8:16]
result = b''
for i in range(0, len(data_b_pad), blocksize):
block = data_b_pad[i:i+blocksize]
if i > 0:
result0 = XOR.new(result3).encrypt(block)
else:
result0 = block
result1 = DES.new(key_1_b, DES.MODE_CBC, iv).encrypt(result0)
result2 = DES.new(key_2_b, DES.MODE_CBC, iv).decrypt(result1)
result3 = DES.new(key_1_b, DES.MODE_CBC, iv).encrypt(result2)
result += result3
return result
加密没有错误。
但是当我尝试使用此代码解密加密消息时:
def like_3DES_decrypt(message_bytes, key_16bytes_hex):
blocksize = 8
key_b = bytes.fromhex(BitArray(hex=key_16bytes_hex).hex)
iv = bytes.fromhex(BitArray(hex='0000000000000000').hex)
# split the key on half size
key_1_b = key_b[:8]
key_2_b = key_b[8:16]
result = b''
for i in range(len(message_bytes), 0, - blocksize):
block = message_bytes[i-blocksize:i]
result1 = DES.new(key_1_b, DES.MODE_CBC, iv).decrypt(block)
result2 = DES.new(key_2_b, DES.MODE_CBC, iv).encrypt(result1)
result3 = DES.new(key_1_b, DES.MODE_CBC, iv).decrypt(result2)
if i > blocksize:
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
else:
result4 = result3
result = result4 + result
result = removeBitPadding(result)
return result
我解密长消息有什么问题?
谢谢
错误消息 ValueError: XOR key must be no longer than 32 bytes
告诉您不能使用大于 32 字节的密钥初始化 XOR 对象。通过检查 source code,您可以看到这是在第 61 行强制执行的。要使用更大的密钥执行异或运算,您需要不同的实现。
你的线路
result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)
虽然看起来有点奇怪,也许你已经用密钥交换了消息:
result4 = XOR.new(result3).encrypt(message_bytes[i-(blocksize*2):-blocksize])