要支持某些旧版应用程序,我需要在python中实现PBEWithMD5AndDES
(RFC2898 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]
答案 0 :(得分:2)
是否有一种方法可以使用pyca / cryptography对单个DES进行加密?
是的,只需将8个字节的密钥传递给cryptography.hazmat.primitives.ciphers.algorithms.TripleDES
。这将对三重DES中的每个DES转换使用相同的密钥。
三重DES也称为DES-EDE,用于先加密,先解密,然后再加密。如果您对每个密钥使用相同的密钥,那么其中一对加密/解密对将产生身份功能,仅留下一个DES加密。
请注意,并非所有的三重DES实现都将接受单个密钥(因为通常存在单个DES),但是该密钥可以:
密钥。这必须保密。
64
,128
或192
位长。 DES仅使用密钥的56
,112
或168
位,因为密钥的每个组成部分都有一个奇偶校验字节。某些写作提到最多有三个分别为56
位长的独立密钥,可以将它们简单地连接起来以产生完整密钥。
尽管我必须承认,您必须了解三重DES如何工作才能使该文本有意义。
还要注意,目前尚未优化单个DES的DES-EDE实施,即使它们中的两个相互抵消,它也会执行所有三个操作。