Этот вопрос связан с этой: 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☻☻
из «123456» 6 и Decrypter выходов 8 байт положения remaing заполняются байтами по умолчанию, так что rstrip полосы байт и дает строка – Rohit