目录

  1. DES 弱密钥
  2. 部分弱密钥
  3. 有弱密钥的加密算法
  4. 参考资料

DES 是一种块密码,属于对称密码算法。密钥长度为 56bit,如果算上校验位可以认为是 64bit,就是 8 字节。
在 DES 加密中,有一些密钥属于 “弱密钥” 和“部分弱密钥”,严禁在加密的过程中使用。

DES 弱密钥

在 DES 的计算中,56bit 的密钥最终会被处理为 16 个轮密钥,每一个轮密钥用于 16 轮计算中的一轮,DES 弱密钥会使这 16 个轮密钥完全一致,所以称为弱密钥。

有四个弱密钥是绝对不能使用的:

\x01\x01\x01\x01\x01\x01\x01\x01
\xFE\xFE\xFE\xFE\xFE\xFE\xFE\xFE
\xE0\xE0\xE0\xE0\xF1\xF1\xF1\xF1
\x1F\x1F\x1F\x1F\x0E\x0E\x0E\x0E

如果不考虑校验位的密钥,下面几个也是属于弱密钥的:

\x00\x00\x00\x00\x00\x00\x00\x00
\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF
\xE1\xE1\xE1\xE1\xF0\xF0\xF0\xF0
\x1E\x1E\x1E\x1E\x0F\x0F\x0F\x0F

如果使用弱密钥,PC1 计算的结果会导致轮密钥全部为 0,全部为 1 或全部 01 交替。
因为所有的轮密钥都是一样的,并且 DES 是 Feistel 网络的结构,这就导致加密函数是自反相 (self-inverting) 的,结果就是加密一次看起来没什么问题,但是如果再加密一次就得到了明文。

部分弱密钥

部分弱密钥是指只会在计算过程中产生两个不同的子密钥,每一个在加密的过程中使用 8 次。这就意味着这对密钥 K1 和 K2 有如下性质:
部分弱密钥性质

6 个常见的部分弱密钥对

  • 0x011F011F010E010E and 0x1F011F010E010E01
  • 0x01E001E001F101F1 and 0xE001E001F101F101
  • 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
  • 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
  • 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
  • 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1

OpenSSL 中对弱密钥的检查

119 static const DES_cblock weak_keys[NUM_WEAK_KEY]={
120     /* weak keys */
121     {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
122     {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
123     {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
124     {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
125     /* semi-weak keys */
126     {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
127     {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
128     {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
129     {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
130     {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
131     {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
132     {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
133     {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
134     {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
135     {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
136     {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
137     {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};

有弱密钥的加密算法

  • DES
  • RC4
  • IDEA
  • Blowfish

参考资料

  • https://en.wikipedia.org/wiki/Weak_key#Weak_keys_in_DES
  • https://www.lri.fr/~fmartignon/documenti/systemesecurite/4-DES.pdf