对称加密是指加密和解密使用相同密钥的加密方式。Des算法把数据分成长度为64位的数据块,其中8位用作奇偶校,有效密钥长度为56位。它的加密过程包括初始置换、16轮迭代的乘积变换和逆初始置换这些复杂的步骤
举个简单的例子来理解对称加密,就好像你有一个带锁的盒子(代表加密算法),你用一把钥匙(密钥)把东西锁进去(加密),之后要用同一把钥匙才能把东西取出来(解密)。不过DES由于密钥长度相对较短,现在安全性有所下降,已经逐渐被AES等更安全的对称加密算法所替代,但它在密码学的发展历程中有很重要的地位。
1.算法分析
示例场景
假设我们要使用DES加密算法对消息“HELLO”进行加密,设定的密钥为“ABCDEFGH”(实际应用中密钥要复杂且保密得多哦)。
前期准备
• 数据处理:
• DES算法处理的数据单位是64位的分组。首先要把我们要加密的消息“HELLO”转换为二进制数据,并且按照64位为一组进行划分。这里就涉及到字符编码的知识啦,一般常用ASCII编码将字符转换为二进制。比如,“H”的ASCII码是72,转换为二进制就是01001000 。依次把“HELLO”每个字符都转换后,再拼接起来,假设得到的二进制数据是不足64位的(实际这个例子肯定不足啦),那还需要按照规则进行填充,使它达到64位。填充方式有多种,常见的是在末尾添加特定字符(如空格等)对应的二进制数据,直到达到64位。
• 密钥方面,同样要把“ABCDEFGH”转换为二进制数据,并且只取其有效的56位作为真正用于加密的密钥部分,另外8位是用于奇偶校验的,这里先不管校验的事儿,就重点关注那56位有效密钥哦。假设转换后得到了56位的密钥二进制数据。
加密过程
1. 初始置换(IP)
• 含义:这一步是对我们准备好的64位明文分组进行一次固定的位置置换。就好比有一个表格,规定了原来在某个位置的二进制位要换到新的位置上去。
• 示例“算数”:比如说,初始置换规则规定原来的第1位要换到第58位,第2位要换到第50位等等,按照这个规则把64位明文分组里的每一位都进行置换。假如我们之前得到的“HELLO”对应的64位明文分组是(这里简单示意一下,实际很长哦):0100100001000101010011000100110001001111 (假设经过填充后的哦),按照初始置换规则置换后就会变成另外一个样子的64位数据啦。
2. 16轮迭代的乘积变换
• 轮密钥生成:
• 在进行这16轮迭代之前,要先从我们之前准备好的56位有效密钥生成每一轮需要用到的子密钥。这也是有一套复杂的规则哦。大致过程是,先把56位密钥分成两部分,比如左边28位和右边28位,然后按照特定的旋转规则(比如每轮旋转一定的位数,这个旋转位数在每轮可能还不一样哦)对这两部分分别进行旋转操作,之后再从经过旋转后的两部分中选取特定的位组合成每一轮需要的48位子密钥。比如说,第一轮可能是从经过旋转后的两部分中选取第1到第48位组合成第一轮的子密钥;第二轮又会根据新的旋转和选取规则生成新的子密钥,就这样一轮一轮地生成,总共生成16轮所需的子密钥。
• 示例“算数”:假设56位有效密钥经过第一轮的旋转和选取规则后,生成的第一轮48位子密钥是(简单示意):10101010101010101010101010101010101010101010101010101010 (实际是根据复杂规则生成的啦)。
• 每轮迭代操作:
• 对于每一轮迭代,都要用当前轮生成的子密钥对经过初始置换后的明文分组进行操作。主要操作包括扩展置换、异或运算、S盒替换、P盒置换等。
• 扩展置换:就是把经过初始置换后的64位明文分组中的部分位按照一定规则扩展成更多的位,比如从32位扩展成48位。这就像是把原本集中在一起的一些二进制信息分散开,方便后续和子密钥进行操作。
• 异或运算:将扩展置换后的48位数据和当前轮的48位子密钥进行异或运算(异或运算就是相同为0,不同为1啦)。比如说,扩展置换后的48位数据是(简单示意):11111111111111111111111111111111111111111111111111111111 ,和第一轮的子密钥(上面假设的那个)进行异或运算后,得到新的48位数据(根据异或规则计算哦)。
• S盒替换:异或运算后的48位数据要进入S盒进行替换操作。S盒是DES算法中很重要的一个部分,它里面有8个小盒子(每个小盒子可以看成是一个函数哦),每个小盒子接收6位输入数据,然后输出4位数据。所以要把异或运算后的48位数据分成8组,每组6位,分别送入8个S盒中,每个S盒输出4位,这样就总共输出32位数据啦。
• P盒置换:S盒替换后得到的32位数据还要进行P盒置换,这又是一次按照固定规则对32位数据的位置进行重新排列,就像初始置换一样,只不过是针对32位数据啦。经过P盒置换后,就完成了一轮迭代的操作。
3. 逆初始置换(IP^-1)
• 含义:在经过16轮迭代后,得到的数据还要进行一次逆初始置换,就是把前面初始置换的操作反过来做一次,把经过16轮迭代后得到的64位数据的每一位按照逆初始置换规则再换回到原来的位置(当然是相对于初始置换前的那种相对位置啦)。
• 示例“算数”:假设经过16轮迭代后得到的64位数据是(简单示意):01010101010101010101010101010101010101010101010101010101 ,按照逆初始置换规则置换后,就得到了最终的密文啦,这个密文也是64位的二进制数据。
总结
通过以上一步步的操作,我们就完成了对“HELLO”这个消息的DES加密过程,从原始的消息转换为二进制、经过各种置换、运算和迭代,最终得到了密文。而解密过程就是把这些步骤反过来做,用同样的密钥,按照相反的顺序进行相应的操作,就可以还原出原始消息啦。
2.使用java语言实现DES对称加密
如果有写好的,放在评论区谢谢