2016-12-01 1 views
0

Hy,python3 PyCrypto produire un ValueError quand décrypter long message

je dois déchiffrer un message chiffré avec DES DES et XOR.
Lorsque je décrypte un message de 24 octets, il s'exécute correctement.
Mais avec 40 octets et plus, produire une erreur comme celle-ci:

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 

Je chiffrent le message avec ce code:

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 

Le cryptage fonctionne sans erreur.

Mais lorsque je tente de décrypter le message crypté avec ce code:

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 

Quel est le problème quand je décrypter le long message?

Merci

Répondre

0

Le message d'erreur ValueError: XOR key must be no longer than 32 bytes vous indique que vous ne pouvez pas initialiser un objet XOR avec une clé supérieure à 32 octets. En inspectant le source code, vous pouvez voir que cela est appliqué à la ligne 61. Pour effectuer un xor avec des clés plus grandes, vous aurez besoin d'une implémentation différente.

Votre ligne

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

semble un peu bizarre mais, peut-être vous avez troqué le message avec la clé:

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

+1

Désolé pour mon retard commentaire. il s'exécute. :-) – Brawn1