为何PyCryptodome的3DES算法使用128位/192位密钥而非56位
3DES相关疑问解答
密钥长度差异说明
你混淆了单DES与3DES的密钥长度标准,维基百科提到的56位是单DES的有效密钥长度,3DES作为DES的迭代增强算法,本身不存在单56位密钥的实现。Pycryptodome的3DES密钥长度要求完全符合NIST规范,没有做特殊调整:
- 2密钥3DES(2TDEA):使用2组独立的56位有效密钥,总有效长度112位,加上每组密钥每个字节的1位奇偶校验位后,总长度为16字节(128位),即库支持的128位密钥
- 3密钥3DES(3TDEA):使用3组独立的56位有效密钥,总有效长度168位,加上奇偶校验位后总长度为24字节(192位),即库支持的192位密钥
Pycryptodome会自动忽略每个密钥字节的第8位奇偶校验位,仅使用前7位作为有效密钥位,符合3DES的标准实现要求。
与AES速度、输出相似的原因
- 速度相近:小数据量加密测试下,耗时主要来源于库初始化、随机IV生成、系统调用等固定开销,算法本身的运算耗时占比极低,无法体现性能差异。如果测试GB级大文件加密,且CPU开启AES-NI指令集加速的前提下,AES加密速度会达到3DES的3~10倍,性能差距会非常明显。
- 输出相似:你测试时两款算法均使用了OFB模式,该模式属于流加密工作模式,输出密文长度和明文完全一致,且均为无规律的伪随机字节序列,肉眼观测自然会有相似感。实际将密文转为十六进制逐位对比会发现完全不同,且由于每次加密的IV为随机生成,哪怕同一算法、同一密钥、同一明文,每次加密的输出也会不同,属于正常现象。
代码正确性验证
你提供的3DES加密代码用法完全符合Pycryptodome的规范,没有操作错误:
from Crypto.Cipher import DES3 from Crypto import Random key = 'Sixteen byte key' iv = Random.new().read(DES3.block_size) cipher_encrypt = DES3.new(key, DES3.MODE_OFB, iv) plaintext = "Some data to encrypt with 3DES" encrypted_text = cipher_encrypt.encrypt(plaintext.encode("utf-8")) cipher_decrypt = DES3.new(key, DES3.MODE_OFB, iv) cipher_decrypt.decrypt(encrypted_text)
你使用的16字节密钥对应合法的2密钥3DES模式,可正常完成加解密操作。
内容的提问来源于stack exchange,提问作者Yılmaz Alpaslan
相关产品推荐
相关产品推荐

