DES加密算法在很多行业都有着非常广泛的应用,对于初学者,开始很容易被ECB、CBC以及计算MAC搞得困惑不已,下面我将一一介绍这几者之间的关系,希望对新人有帮助。为了易于表述,下面所有的密钥及数据都用16进制字符串表示(比如:0x12 0x34 0x56 0x78会被直接写成12345678)。另外,最好你手头上有DES计算工具,以便做一些演算,这样可以更好地学习本篇文章的内容。)
1. DES(单倍长)与3DES(双倍长)ECB加密
1.1 DES
SDES_Key=3DES_Key_Left8=9BED98891580C3B2
Input=F4F3E7B3566F6622 // D1
ECB加密的结果=5416B1A553743610 // O1
Input=098750B491EA8D5C // D2
ECB加密的结果=48A9014362846BA2 //
Input=F4F3E7B3566F6622098750B491EA8D5C // D1 || D2
ECB加密的结果=5416B1A55374361048A9014362846BA2 // O1 || O2
每一轮DES ECB加密都是把数据按8字节来分组,各个分组之间彼此独立
1.2 3DES(双倍长
3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A // 左边8字节的Key和SDES_Key一样
Input=F4F3E7B3566F6622098750B491EA8D5C
ECB加密的结果=FE7B6C8A73167964798EBAC2BA4899AA
看过PBOC规范中关于3DES ECB加密的描述,3DES和DES加密的差别在于3DES加密是在DES加密的结果基础上再用右边8字节的密钥解密,
然后再用左边8字节的密钥进行加密,得到的结果即最终密文数据。演算过程如下
3DES_Key_Left8=9BED98891580C3B2
3DES_Key_Right8=45FE9EC58BFA8D2A
(1)用3DES_Key_Left8(9BED98891580C3B2)对Input(F4F3E7B3566F6622098750B491EA8D5C)加密得到5416B1A55374361048A9014362846BA2;
(2)用3DES_Key_Right8(45FE9EC58BFA8D2A)对5416B1A55374361048A9014362846BA2解密得到685F98099C7D741B9A849E2C8DFFC430
(3)3DES_Key_Left8(9BED98891580C3B2)对685F98099C7D741B9A849E2C8DFFC430加密得到FE7B6C8A73167964798EBAC2BA4899AA。
是不是很简单?
2. ECB加密模式和CBC加密模式的差异
3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A
IV=0000000000000000 // 初始向量,其作用是先与Input的前8字节做异或运算,得到的结果才被用于DES加密
Input=F4F3E7B3566F6622098750B491EA8D5C
ECB加密的结果=FE7B6C8A73167964798EBAC2BA4899AA
CBC加密的结果=FE7B6C8A731679649273F6368EAE9E98
ECB加密和CBC加密的结果是不是有点像?这里2者的结果差异是前8字节一样,后面的不一样,为什么?
因为对于CBC加密来说,其加密是链式的,后面的加密结果依赖于前面的结果
对于第一块待加密数据,其首先要和IV异或得到D1,D1作为真实的输入,对D1加密得到的结果记为O1;
对于第二块待加密数据,其首先要和O1异或得到D2,D2作为真实的输入,对D2加密得到的结果记为O2。
如果还有其他数据,类推,直到算出最终的结果。
我们来演算一下CBC的加密过程:
(1)IV(0000000000000000)和Input的第一块数据F4F3E7B3566F6622进行异或运算得到F4F3E7B3566F6622(因为IV是全0的缘故,第一块输入数据并没有改变!),记为D1。
(2)对D1进行ECB加密得到FE7B6C8A73167964,记为O1。
(3)O1和第二块输入数据进行异或运算得到F7FC3C3EE2FCF438,记为D2。
(4)对D2进行ECB加密得到9273F6368EAE9E98,
最终的CBC加密结果O1||O2,FE7B6C8A731679649273F6368EAE9E98。
所以从本质上讲,ECB、CBC只是在对输入数据的处理上有差异,对于底层的加密算法,实际上都是ECB加密模式。
3. MAC的真实面目
3.1 单倍长密钥计算MAC
对于单倍长密钥计算MAC,通常都是采用ANSI X9.9标准,其本质就是CBC加密,取最终的结果的最后8字节为MAC(有些规范再取其中的前4字节为MAC)。
SDES_Key=9BED98891580C3B2
IV=0000000000000000 // 初始向量,CBC加密运算需要
Input=F4F3E7B3566F6622098750B491EA8D5C6
CBC加密结果=5416B1A5537436105B6E2CAC0F87986F
取最后的8字节为MAC即:5B6E2CAC0F87986F
3.2 双倍长密钥计算MAC
PBOC规范中采用的双倍长MAC计算方法(与ISO 9797-1 MAC algorithm3 一致)是:
(1)用左边8字节的密钥对输入数据进行CBC加密,取密文的最后8字节,记为O1
(2)用右边8字节的密钥对O1进行ECB解密得到O2
(3)用左边8字节的密钥对O2进行ECB加密得到O3,O3即最终 MAC。
3DES_Key=9BED98891580C3B245FE9EC58BFA8D2A
IV=0000000000000000 // 初始向量,CBC加密运算需要
Input=F4F3E7B3566F6622098750B491EA8D5C$ K+ [6 z2 x3 c$ O
(1)用3DES_Key_Left8(9BED98891580C3B2)对Input(F4F3E7B3566F6622098750B491EA8D5C)CBC加密得到5416B1A5537436105B6E2CAC0F87986F,
去最后8字节5B6E2CAC0F87986F为O1;
(2)用3DES_Key_Right8(45FE9EC58BFA8D2A)对O1(5B6E2CAC0F87986F)ECB解密得到0C583C96DE7074B4,记为O2;
(3)3DES_Key_Left8(9BED98891580C3B2)对O2(0C583C96DE7074B4)ECB加密得到MAC(95FA419313B62BA4)
4. DES算法的校验位
DES算法每组密钥为8字节,64bits,实际上参与加/解密运算的只有56bits,因为密钥的每个字节的最低bit(bit 1)被设计成奇偶校验位,所以实际上你用密钥9AEC99881481C2B3替换本文上面的9BED98891580C3B2,这两个密钥的差异只是每个字节的最低bit不一样,但是你会发现所有的计算结果都是一样的。
结语,MAC算法本质上就是CBC加密算法,对于3DES MAC计算还需加上一点变化,而CBC加密本质上还是ECB加密。