标题看起来似乎有点吓人,但说实话,鹦鹉先生实在想不到更为精简的表达方式了。今天要铺的马路有点杂,但是起着承上启下的关键作用。因为,我们将要去往另一个密码学世界了。
这一期,咱们先解决上一期遗留的一个小问题:AES的密钥扩展,再聊一聊分组密码是如何将长明文源源不断地转换为密文的。结束时,我们承上启下,准备进入一个全新世界——非对称密码体制。
在上一期结尾,我们提到了,AES的“输入密钥”实际上只能算是一个“种子密钥”,因为在具体使用中,我们需要将它进行扩展成与半成品“明文”匹配的长度,才可以进行异或操作。那具体怎么扩展的,下面就开始分析。
密钥扩展一共只有4步,每一步可谓是有手就行。下面举的例子,是以分组和密钥长度都是128比特,由查表大法得,一共10轮迭代,共需11个子密钥(为啥是11个泥?)。而这里每一个子密钥,都是128比特大小。
开始之前,还是老规矩,先把种子密钥按矩阵排好。
01
循环移位
将最后一列头上的字节块搬到这一列的末尾。
02
过S盒
来来来,查表查表!对每一个字节块过S盒,找到对应待替换的字节块,再填回原位。
03
向量异或
这一步并不是每次都要,只有轮密钥的第一列才需要。取出第一列,再与两个向量进行异或,将结果填到新的一列即可。这两个向量,一个是固定的矩阵(RC),一个是密钥的最后一列。
这个RC矩阵,是由很多个与一列密钥大小匹配的向量构成。这个向量,只有头8比特有变化,其他都是0。头8比特的变化规律:01,02,04,08,10,20,40,80,1B,36。
04
递归扩展
把空位的前一列,和空位对应上一组的对应列进行异或,再填回空位。是不是有点绕?看图更易理解。
完成,咱们已经解决了一轮的密钥扩展了!接下来,只需不断地重复以上步骤,将密钥扩展到指定长度即可!
在此之前,我们已经了解了DES和AES算法,它们都是分组加密算法,一口气只会加密一小段明文。显然,在我们平日生活中,很少会碰到和加密算法分组大小刚好匹配的明文。所以,在密码学中,我们常常将加密算法和密码工作(运行)模式相结合,来完成长明文的加密。
这里,鹦鹉先生介绍5个密码工作模式,了解即可。
1
电码本模式(ECB)
2
密码分组链接模式(CBC)
3
密码反馈模式(CFB)
4
输出反馈模式(OFB)
5
计数器模式(CTR)
讲了这么多,我们的对称密码体制也将要告一段落了。对称密码体制,最突出的特点就在它的“对称”两字——加解密使用了同一个密钥。虽然看上去,通信双方都将一个密钥保密即可,但如果通信的人多了怎么办?就好比网络上的网站服务器,每时每刻都要处理来自世界各地,成千上万的网站请求。显然,为每一个连接服务器的用户专门配一个对称密钥,是不现实的,密钥将会越来越多,越来越难以管理。
因此,我们可以引入非对称密码体制,也叫做公钥密码体制。这一体制最为显著的特征,就是有两把钥匙——公钥和私钥。在非对称密码体制中,将原本既负责加密又负责解密的一个密钥,分解成两个相关联,但是不可互相推导的密钥,一个可以公开给任何人,另一个必须保密。这样,我们只需要保密好我们的私钥,就可以解决因密钥数量庞大而带来的密钥管理问题。
为保证非对称密码体制的安全性,我们需要对这类体制提出一定的要求:
- 产生公私钥对是比较容易的;
- 用公私钥对信息进行处理,是比较容易的;
- 由公钥和密文推知私钥或明文,在计算上是不可行的。
首先,我们需要保证,在非对称密码体制下,加密解密(签名验证)的速度是用户可接受的。其次,为了防止敌手得到私钥或者看到明文,我们要求“计算上不可行”。为什么这么说呢?因为,不排除敌手使用不讲武德的方法得到私钥,比如,拿扳手撬开你的嘴。
所以,“计算上不可行”往往建立在一个就目前来看,是一个数学界里极其困难的问题。如果哪天,有人解决了这些困难问题,这些密码体制的安全性就很可能受到威胁。“计算上不可行”,重点还在“计算”二字。如果使用暴力枚举的方法,把所有的可能都试一遍,也不是不行。但是,你需要付出以下两类的代价:
- 秘密被破解了,但是才值几个钱,还不够补贴电费;
- 秘密被破解了,地球已进入下一个纪元。
当然,这里还有一种不讲武德的办法,那就是使用量子计算机,因为这家伙具有超高的并行性,同时可以尝试多种可能,唯一的Bug可能就是要花一点电费了。
Reference:
《现代密码学 -- 杨波 著》
《Cryptography and Secure Communication -- Richard E. Blahut》
《Computer Security: Principles and Practice (Fourth Edition)》