【问题标题】:Python3 PyCrypto produce a Valueerror when decrypt long messagePython3 PyCrypto 在解密长消息时产生 Valueerror
【发布时间】:2016-12-01 07:59:17
【问题描述】:

喂,

我必须使用 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

解密长消息有什么问题?

谢谢

【问题讨论】:

    标签: python-3.x cryptography pycrypto des cbc-mode


    【解决方案1】:

    错误消息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])

    【讨论】:

    • 抱歉我迟到的评论。它运行。 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多