1先试一下
不足 8 个字符时,后面补零凑满。
同一句话,换把钥匙就会得到完全不同的结果。
想直接用十六进制数字?
每个框 16 个十六进制数字,也就是 64 位。上面两个文本框会自动同步到这里。
—
—
—
—
2一步一步看
整台机器一共 20 步。 点“播放”让它自己走,或者用下面那排小方块直接跳到某一轮。
—
技术细节
316 把钥匙是怎么来的
加密要用 16 把不同的钥匙,但它们不是凭空生成的 —— 全都来自你输入的那一把。 先把 64 位去掉 8 位变成 56 位,然后每一轮左移几位、再挑出 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 编译后跑出来的结果被存成了标准答案,浏览器里的实现必须逐位对上才算通过。
DES.c 自己打印出来的结果(原样抄录)
术语小抄
- 明文 / 密文
- 加密前的原文,加密后的乱码。
- 密钥
- 你就是靠它把密文变回明文的。钥匙丢了,内容就拿不回来了。
- 比特 / 位
- 一个 0 或一个 1。DES 一次处理 64 个比特。
- 置换
- 只是把位置重新排一遍,不改变内容:0 还是 0,1 还是 1。
- 异或(XOR)
- 两个比特比对:相同得 0,不同得 1。它可逆,异或两次就变回原样。
- 轮(round)
- 重复做一遍同样的搅拌动作。DES 做 16 轮。
- Feistel 结构
- 把数据分成左右两半,反复“搅拌右边、盖到左边、左右对调”。这样加密和解密能共用同一套电路。
- DES 现在还能用吗
- 不能。56 位的钥匙以今天的算力可以被暴力破解,它已经被 AES 取代。但它仍然是理解分组密码最好的教材。