明明白白使用DES加密算法


                    

       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加密。

你可能感兴趣的:(算法)