具有pyca / cryptography的DES密码(PBEWithMD5AndDES)

时间:2019-01-17 13:43:37

标签: python cryptography pycrypto

要支持某些旧版应用程序,我需要在python中实现PBEWithMD5AndDESRFC2898 Section 6.1)。我知道这是不安全的,已弃用,不应再使用。但这是我的要求。

我已经有一个使用PyCrypto / PyCryptodome的工作版本,但是我需要引入PyCryptodome作为项目的附加依赖项,这是我要避免的事情。因为我们已经在代码的其他部分使用了pyca/cryptography,所以我更喜欢这个库而不是PyCrypto(dome)。但是,由于PBEWithMD5AndDES的性质,我需要DES加密支持,但据我了解,pyca/cryptography仅支持三重DES(3DES)。

是否有一种方法可以使用pyca/cryptography对DES进行加密(单个)?基本上,我需要用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)



更新

感谢@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 :(得分:2)

  

是否有一种方法可以使用pyca / cryptography对单个DES进行加密?

是的,只需将8个字节的密钥传递给cryptography.hazmat.primitives.ciphers.algorithms.TripleDES。这将对三重DES中的每个DES转换使用相同的密钥。

三重DES也称为DES-EDE,用于先加密,先解密,然后再加密。如果您对每个密钥使用相同的密钥,那么其中一对加密/解密对将产生身份功能,仅留下一个DES加密。


请注意,并非所有的三重DES实现都将接受单个密钥(因为通常存在单个DES),但是该密钥可以:

  

密钥。这必须保密。 64128192位长。 DES仅使用密钥的56112168位,因为密钥的每个组成部分都有一个奇偶校验字节。某些写作提到最多有三个分别为56位长的独立密钥,可以将它们简单地连接起来以产生完整密钥。

尽管我必须承认,您必须了解三重DES如何工作才能使该文本有意义。

还要注意,目前尚未优化单个DES的DES-EDE实施,即使它们中的两个相互抵消,它也会执行所有三个操作。