2016-12-01 7 views
0

のHy、のpython3 PyCryptoは長いメッセージ

を復号化するとき、私はDESとXORとDES暗号化されたメッセージを復号化しなければならないとValueErrorを作り出します。
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 

私は長いメッセージを復号化する際に間違っていますか?

あなたは

答えて

0

エラーメッセージValueError: XOR key must be no longer than 32 bytesは、あなたが32バイトを超えるキーでXORオブジェクトを初期化することができないことを示していますありがとうございました。 source codeを調べると、これが61行目で実行されているのが分かります。大きいキーでxorを実行するには、別の実装が必要です。

result4 = XOR.new(message_bytes[i-(blocksize*2):-blocksize]).encrypt(result3)

あなたのラインは、多分あなたは鍵でメッセージを交換されている、しかし少し奇妙に思える:私の後半のコメントを

result4 = XOR.new(result3).encrypt(message_bytes[i-(blocksize*2):-blocksize])

+1

申し訳ありません。 実行されます。 :-) – Brawn1