2014-10-02 1 views
2

Этот вопрос связан с этой: Replicate Java's PBEWithMD5AndDES in Python 2.7 Python 2 - PBEWithMD5AndDES расшифровывать Java-


Это был ответ на вопрос (код Python):

from Crypto.Hash import MD5 
from Crypto.Cipher import DES 

_password = 'q1w2e3r4t5y6' 
_salt = '\x80\x40\xe0\x10\xf8\x04\xfe\x01' 
_iterations = 50 

if "__main__" == __name__: 

    """Mimic Java's PBEWithMD5AndDES algorithm to produce a DES key""" 
    print "Enter the password to encrypt:", 
    plaintext_to_encrypt = raw_input() 

    hasher = MD5.new() 
    hasher.update(_password) 
    hasher.update(_salt) 
    result = hasher.digest() 

    for i in range(1, _iterations): 
     hasher = MD5.new() 
     hasher.update(result) 
     result = hasher.digest() 

    # Pad plaintext per RFC 2898 Section 6.1 
    padding = 8 - len(plaintext_to_encrypt) % 8 
    plaintext_to_encrypt += chr(padding) * padding 

    encoder = DES.new(result[:8], DES.MODE_CBC, result[8:16]) 
    encrypted = encoder.encrypt(plaintext_to_encrypt) 

    print encrypted.encode('base64') 

Я сейчас пытаюсь сделать обратную операцию (расшифровать) с зная _password, _salt и _iterations переменные, конечно.

print encoder.decrypt(encrypted) не соответствует первоначальному паролю.

Я не знаю, что делать дальше. Я прочитал §6.1.2 из rfc2898, но это мне не помогло. Может ли кто-нибудь привести меня к правильному ответу?

EDIT:
Похоже, что необходимо следующее:

encoder2 = DES.new(result[:8], DES.MODE_CBC, result[8:16]) 
print encoder2.decrypt(encrypted) 

Почему я должен использовать DES.new() снова? Как я могу избавиться от прокладки?
Фактический расшифрован выходом для «123456» является 123456☻☻

ответ

0

Просто возьмите последние байты и удалить стольких символов, сколько он кодирует (в том числе последнего байта).

Опасайтесь, что вы должны добавить тег аутентификации, если вы уязвимы для ошибок, таких как оскорбительные ошибки.

1

ли как этот

decrypted = encoder2.decrypt(encrypted) 
    print decrypted.rstrip('\2,\1,\3,\4,\5,\6,\7') 

Длина "123456" 6 и Decrypter выходы 8 байт. Оставшаяся позиция заполняется байтом по умолчанию, поэтому rstrip разбивает байты и дает строку.

EDIT: Я создал суть см этой длину Link

+0

из «123456» 6 и Decrypter выходов 8 байт положения remaing заполняются байтами по умолчанию, так что rstrip полосы байт и дает строка – Rohit

 Смежные вопросы

  • Нет связанных вопросов^_^