为什么 PyCryptoDome 的 3DES 算法使用 128 位或 192 位密钥而不是 56 位?

Why PyCryptoDome's 3DES algorithm uses 128-bits or 192-bits key instead of 56-bits?

根据维基百科,3DES 的密码使用 56 位加密密钥来加密数据;但是 Pycryptodome 的 3DES class 使用 128 位或 192 位加密密钥。此外,Pycryptodome 的 AES 和 3DES 的加密速度相同,输出相似。是我做错了什么还是这个 3DES 有点不同?

这是我在 Python 中使用 3DES 算法加密数据的代码:

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)

单个 DES 有 56 位有效密钥大小,不是 64。 8 位用于 parity bits。 64 位密钥大小符合标准,即使在测试密钥每个字节的奇偶校验之前,它们也大多被丢弃。

DES 对于 bruteforce 是不安全的,因此建议使用 2DES 和 3DES 作为解决方法。

3DES 定义为 c = E(k3,D(k2,E(k1,m))) 其中 E 表示加密 D 表示解密。

3DES 有 3 个选项

  1. T3DEA 使用 3 个独立密钥,k1、k2 和 k3,密钥大小为 56*3 = 168 位。
  2. 2TDEA 使用 2 个独立密钥,其中 k1 = k3,密钥大小为 56*2 = 112 位
  3. 这次所有密钥都相同,k1=k2=k3,我们得到一个 DES,这已经是不安全的了。

虽然选项 1 和 2 可以被视为安全的,但它们并非如此。 DES 的 64 位块大小使其易受 sweet32 attack 影响,就像任何其他 64 位块大小的密码一样。要么将 AES 与 GCM 结合使用,要么将 ChaCha20 与 Poly1305 结合使用。


请注意,pycryptodome document 也已经以类似的方式提到了这一点,因为这是标准。

key (bytes/bytearray/memoryview) – The secret key to use in the symmetric cipher. It must be 16 or 24 byte long. The parity bits will be ignored.

选项 3 (singe DES) 不受支持,库需要包含奇偶校验位的 16 或 24 字节密钥。它们会被忽略,不会被检查。您可以简单地使用 16 或 24 字节长的随机密钥。