作者:Sherkey
最近在研究Padding Oracle渗透测试,发现网上没有详细讲原理的文章。因此自己整理了这样一篇,希望哪怕是没有密码学基础的朋友也能看完后完全理解攻击的原理。
一、基础知识介绍
本节针对无密码学基础的读者,若均理解可直接跳过。
1.1 什么是分组密码?
以下定义来自维基百科:
在密码学中,分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。它将明文分成多个等长的模块(block),使用确定的算法和 对称密钥对每组分别加密解密。
简单来说,就是将明文进行分组,每组分别加密,最后再连在一起形成密文。AES, DES等加密方法均属于分组加密。
1.2 什么是PKCS#5?
正如1.1中所说,分组密码中,需要对明文进行分组。
但是分组要求每个块的大小都要相同。
那么问题就来了,如果说我的明文是‘testabc’,而我用的分组密码是五个一组。这样第一组内容是‘testa’,那么第二组只剩下了‘bc’,不够五个,应该怎么办呢?
这是就要用到一种填充方式,用来把最后空出来的几位填满。
而PKCS#5,就是一种由RSA信息安全公司设计的填充标准。
对于PKCS#5标准来说,一般缺少几位,就填充几位那个数字。
比方说,在上面的例子里,我们有三位空缺,那么就要在空缺处都填上3 。这样,第二组的内容就变成了‘bc333’ 。
这里需要注意的是,比如说,如果每个分组是8字节,我的明文是‘testabcd’,这样恰好是8字节了。但是按照PKCS#5的标准,我们仍然需要在后面添加一个块,块里的内容全部填充为8 (因为一个块大小为8字节,而第二个块全部为空,因此有8位需要填充)。
1.3 CBC模式
在密码学中,分组密码有许多的工作模式。
可能有人会问,我们直接分组以后加密不就好了吗,为什么需要设计模式呢?
没错,其实分组后直接加密也是一种设计模式,名为电子密码本(Electronic codebook,ECB)模式。