Шифр DES с pyca / криптографией (PBEWithMD5AndDES) - PullRequest
0 голосов
/ 17 января 2019

Для поддержки некоторых унаследованных приложений мне нужно реализовать 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]

1 Ответ

0 голосов
/ 18 января 2019

Есть ли способ (однократного) шифрования DES с помощью pyca / cryptography?

Да, просто передайте 8-байтовый ключ на cryptography.hazmat.primitives.ciphers.algorithms.TripleDES. При этом будет использоваться один и тот же ключ для каждого преобразования DES в тройном DES.

Triple-DES также известен как DES-EDE для шифрования, дешифрования и затем шифрования. Если вы используете один и тот же ключ для каждого из них, то одна из пар шифрования / дешифрования приведет к функции идентификации, в результате чего останется только один шифрование DES.


Обратите внимание, что не все реализации тройного DES принимают один ключ (так как обычно присутствует один DES), но этот делает:

Секретный ключ. Это должно быть в секрете. Либо 64, 128, либо 192 бит. DES использует только 56, 112 или 168 бит ключа, поскольку в каждом компоненте ключа есть байт четности. В некоторых работах говорится, что имеется до трех отдельных ключей, каждый из которых имеет длину 56 бит, и их можно просто объединить для получения полного ключа.

хотя я должен признать, что вам нужно понять, как работает triple-DES, чтобы разобраться в этом тексте.

Также обратите внимание, что реализация DES-EDE для одного DES в настоящее время не оптимизирована, она будет выполнять все три операции, даже если две из них отменяют друг друга.

...