Для поддержки некоторых унаследованных приложений мне нужно реализовать PBEWithMD5AndDES
( RFC2898, раздел 6.1 ) на python. Я знаю, что это небезопасно, устарело и больше не должно использоваться. Но, к сожалению, это мое требование.
У меня уже есть рабочая версия, которая использует PyCrypto
/ PyCryptodome
, но мне нужно было бы ввести PyCryptodome
в качестве дополнительной зависимости от проекта, чего я хочу избежать. Поскольку мы уже используем pyca/cryptography
в других частях нашего кода, я бы предпочел эту библиотеку над PyCrypto(dome)
. Однако из-за природы PBEWithMD5AndDES
мне нужна поддержка шифрования DES, но pyca/cryptography
, насколько я понял, поддерживает только Triple DES (3DES).
Есть ли способ (однократного) DES-шифрования чего-либо с использованием pyca/cryptography
? В основном мне нужно заменить следующее использование Crypto.Cipher.DES
на что-то из pyca/cryptography
:
key, init_vector = _pbkdf1_md5(a_password, a_salt, a_iterations)
cipher = DES.new(key, DES.MODE_CBC, init_vector)
encrypted_message = cipher.encrypt(encoded_message)
UPDATE :
Благодаря @SquareRootOfTwentyThree я получил следующее:
(key, init_vector) = _pbkdf1_md5(a_password, a_salt, a_iterations)
cipher = Cipher(algorithms.TripleDES(key), modes.CBC(init_vector), default_backend())
encryptor = self.cipher.encryptor()
encrypted = encryptor.update(encoded_message)
encryptor.finalize()
def _pbkdf1_md5(a_password, a_salt, a_iterations):
digest = Hash(MD5(), default_backend())
digest.update(a_password)
digest.update(a_salt)
key = None
for i in range(a_iterations):
key = digest.finalize()
digest = Hash(MD5(), default_backend())
digest.update(key)
digest.finalize()
return key[:8], key[8:16]