python - 带有 pyca/密码学的 DES 密码 (PBEWithMD5AndDES)
问题描述
为了支持一些遗留应用程序,我需要在 python中实现PBEWithMD5AndDES
(RFC2898 第 6.1 节)。我知道这是不安全的,已弃用,不应再使用。但遗憾的是,这是我的要求。
我已经有一个使用PyCrypto
/的工作版本,PyCryptodome
但我需要引入PyCryptodome
作为项目的附加依赖项,这是我想要避免的。因为我们已经pyca/cryptography
在代码的其他部分使用了这个库,所以我更喜欢这个库而不是PyCrypto(dome)
. 但是,由于PBEWithMD5AndDES
我需要 DES 加密支持的性质,但pyca/cryptography
据我所知仅支持三重 DES (3DES)。
有没有办法使用(单个)DES 加密某些东西pyca/cryptography
?基本上我需要用Crypto.Cipher.DES
from替换 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]
解决方案
有没有办法使用 pyca/密码学(单个)DES 加密某些东西?
是的,只需将一个 8 字节的密钥传递给cryptography.hazmat.primitives.ciphers.algorithms.TripleDES
. 这将为三重 DES 中的每个 DES 转换使用相同的密钥。
Triple-DES 也称为 DES-EDE,用于加密、解密和加密。如果您对每个使用相同的密钥,则加密/解密对中的一个将产生身份功能,只留下一个 DES 加密。
请注意,并非所有三重 DES 实现都将接受单个密钥(因为通常存在单个 DES),但这个实现:
密钥。这必须保密。,
64
,128
或192
位长。DES 仅使用密钥的56
、112
或168
位,因为密钥的每个组件中都有一个奇偶校验字节。一些写作指的是最多三个单独的密钥,每个密钥56
长,它们可以简单地连接起来产生完整的密钥。
尽管我必须承认,您必须了解三重 DES 的工作原理才能理解该文本。
还要注意,针对单个 DES 的 DES-EDE 实现目前尚未优化,即使其中两个相互抵消,它也会执行所有三个操作。
推荐阅读
- java - 无法应用插件“net.minecraftforge.gradle”。找到 java 版本 16.0.1。尚不支持版本 16 及更高版本
- javascript - 如何通过 Javascript 获取自定义 css 样式?
- unity3d - 如果蹲下时头顶有东西(统一3d),如何否定我的玩家卡住?
- c# - 焦点在另一个窗口时 FPS 下降
- python - 当我将其转换为 exe 时,Python 有效负载未连接
- wordpress - 如果特定产品是购物车中的唯一商品,则清除购物车(多个 IDS)
- python - 仅舍入特定值,而其他值保持不变
- javascript - JS MediaRecorder API 导出一个不可搜索的 WebM 文件
- azure-blob-storage - Azure 存储生命周期管理的选项有限?
- php - MySQL中同时查询多个列