首页 > 解决方案 > 带有 pyca/密码学的 DES 密码 (PBEWithMD5AndDES)

问题描述

为了支持一些遗留应用程序,我需要在 python中实现PBEWithMD5AndDESRFC2898 第 6.1 节)。我知道这是不安全的,已弃用,不应再使用。但遗憾的是,这是我的要求。

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

有没有办法使用(单个)DES 加密某些东西pyca/cryptography?基本上我需要用Crypto.Cipher.DESfrom替换 from 的以下用法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]

标签: pythoncryptographypycrypto

解决方案


有没有办法使用 pyca/密码学(单个)DES 加密某些东西?

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

Triple-DES 也称为 DES-EDE,用于加密、解密和加密。如果您对每个使用相同的密钥,则加密/解密对中的一个将产生身份功能,只留下一个 DES 加密。


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

密钥。这必须保密。, 64,128192位长。DES 仅使用密钥的56112168位,因为密钥的每个组件中都有一个奇偶校验字节。一些写作指的是最多三个单独的密钥,每个密钥56长,它们可以简单地连接起来产生完整的密钥。

尽管我必须承认,您必须了解三重 DES 的工作原理才能理解该文本。

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


推荐阅读