托马斯.普塔切克曾经发过一条Twitter“如果你不是编写攻击代码的时候学习的密码学,那么你可能根本没有在学密码学”。 从Twitter上对这条信息的关注及其引用数来看,它似乎得到了很多人的认同。尽管我很尊重托马斯,但我绝对不同意他的观点。我认为学习密码学,不仅不需要写代码,而且编写攻击代码对于学习现代密码学根本毫无用处。学习现代密码学最好的方式是研究数学论证。
如果我们仍然是处在20世纪90年代的话,我会同意托马斯的观点。当时的密码学充满了漏洞,你能想到的最浪漫的事就是了解你的工具是如何崩溃的,因为之后你就可以去解决它们的问题。那时,DES和RC4加密算法,尽管有很多已知的缺陷,却被广泛地使用;那时,人们避免使用CTR模式去转换块密码到序列密码,因为他们担心如果所提供的输入数据块中包含有很多相同(0)数据的话,脆弱的块密码会被破解;那时,人们关心块密码的误差传播能力,这关系到在密文中有少量的位发生未知变化后,对于解密数据的正确性会产生多少影响;那时,人们通常建议在加密数据前,先对其进行压缩,因为这将会“压缩”信息熵使得攻击者即使得到了秘钥也很难理解密文。因此,诞生于这个时代的SSL,有很多很多的缺陷,也就不足为奇了。
但是,从2010年开始密码学变得完全不同了。现在,我们开始有了可以高度信赖的的基础构件——比如:块密码已被确信是近似随机排列,并且已经从数学上证明它是足够安全的,可以抵御某些类型的攻击——比如:AES是已知的可以抵御差分密码分析的加密算法。我们以这些组件为基础,利用已被证明是不会引入漏洞的机制创建高阶的系统。例如,如果你在CTR模式下,使用类随机排列的块加密算法(比如,AES)对数据加密,从而产生一个有序的分组序列,并使用分组序列号作为CTR随机数,然后追加一个不易伪造的针对被加密数据的MAC地址(比如,HMAC-SHA256)及分组序列号,那么这些分组既可以保密数据,也可以禁止任何未声明的篡改(包括报文重放和重新排序)。一旦Keccak(即SHA-3)得到更加广泛地检验和信任,生活甚至会变得更加美好,因为它类似海绵的弹性结构去构造大量重要的加密构件,这已经被证明是安全的了。
在20世纪90年代的密码学就像是在尝试建一种桥,你花了许多时间确保你的桥能屹立不倒,并且为此忧心忡忡,即使有一些地方焊接的不够完美,一些螺丝生锈了,由于周期性的负载导致的金属疲劳,等等。虽然从理论上讲量身定制可以有很好效果,但你知道的实际总是与理论不符,因此这座桥实际是建在了安全与不安全的边界上,这使得桥的构造成本更高,也更加复杂。这就是纯粹的工程学。
但是,现代密码学是截然不同的,它不是在建造一座桥,而是像规划一个依靠重力辅助的星际的轨道。当然,这是复杂的,你必须正确的掌握所有的细节。但是,如果你做到了,一旦开始运行,使你无法到达目的地的唯一可能就是物理或数学定理改变了。现代密码学已经充分地发展到理论与实际相符,因此,相比通过观察桥的倒塌进行学习,理论学习就已经十分有效了,然后你需要遵从一个简单的原则:只做数学告诉你你能做的事情。这就是纯粹的科学。
我相信托马斯所做的事情,以及他在实施密码攻击上所积累的经验是非常有用的。毕竟,他是以挖掘应用缺陷为生,但他所遇到的绝大多数加密方法很可能是20世纪90年代的加密方法,那是一个已经逝去的时代。因此对于开发者,我推荐以一个更加现代化的方法学习密码学,那就是学习理论并设计出你能证明是安全的系统。