联邦信息处理标准 FIPS PUB 46(1977)

一段话,是怎么变成乱码的

下面这台机器会把你的文字搅成谁也读不懂的样子,只有拿着同一把钥匙的人才能还原回来。 它就是 DES —— 世界上第一个公开的加密标准。动手试试,或者跟着一步步看它到底做了什么。

1先试一下

不足 8 个字符时,后面补零凑满。

同一句话,换把钥匙就会得到完全不同的结果。

想直接用十六进制数字?

每个框 16 个十六进制数字,也就是 64 位。上面两个文本框会自动同步到这里。

原文

—

—

密文

—

—

图 1  一进一出。右边那串数字就是左边那句话被搅乱之后的样子。

2一步一步看

整台机器一共 20 步。 点“播放”让它自己走,或者用下面那排小方块直接跳到某一轮。

1 / 20

—

图 2  每一格是一个比特:实心是 1,空心是 0,留白把每 8 位分成一组。 把鼠标放到任意一格上,会画出它来自上面哪一位。
技术细节

316 把钥匙是怎么来的

加密要用 16 把不同的钥匙,但它们不是凭空生成的 —— 全都来自你输入的那一把。 先把 64 位去掉 8 位变成 56 位,然后每一轮左移几位、再挑出 48 位。

轮循环左移这一轮使用的钥匙(48 位)

表 1  16 把轮子钥匙。当前进行到的那一轮会标出来。 中间的 56 位状态(C‖D)在下面单独展开 —— 那里用方格逐个显示,比挤在表格里看得清楚。

3三个值得亲手试的现象

把原文里的一个比特翻过来(大致相当于改一个字),看看密文有多少位跟着变。 如果只变一两位,说明加密做得不好;理想情况是乱掉一半。试试看。

把原文和钥匙每一位都反过来(0 变 1、1 变 0),密文也会每一位都反过来。 这不是巧合,是 DES 的一个精确性质:E(~P, ~K) = ~E(P, K)。 DES.c 原程序的最后一段验证的正是这件事。

解密并没有另一套“逆算法”。它和加密是同一段代码,只是把 16 把钥匙倒过来用: 先用第 16 把,最后用第 1 把。这是 Feistel 结构最漂亮的地方。

4这个演示可信吗

页面上的每一个数字都不是画出来好看的。原始的 DES.c 一行都没有改过, 用 gcc 编译后跑出来的结果被存成了标准答案,浏览器里的实现必须逐位对上才算通过。

400 组随机数据 + 3 组完整中间过程
DES.c 自己打印出来的结果(原样抄录)

    

术语小抄
明文 / 密文
加密前的原文,加密后的乱码。
密钥
你就是靠它把密文变回明文的。钥匙丢了,内容就拿不回来了。
比特 / 位
一个 0 或一个 1。DES 一次处理 64 个比特。
置换
只是把位置重新排一遍,不改变内容:0 还是 0,1 还是 1。
异或(XOR)
两个比特比对:相同得 0,不同得 1。它可逆,异或两次就变回原样。
轮(round)
重复做一遍同样的搅拌动作。DES 做 16 轮。
Feistel 结构
把数据分成左右两半,反复“搅拌右边、盖到左边、左右对调”。这样加密和解密能共用同一套电路。
DES 现在还能用吗
不能。56 位的钥匙以今天的算力可以被暴力破解,它已经被 AES 取代。但它仍然是理解分组密码最好的教材。