注: 这个是最近的工程实践作业,根据书上理解原理后采用golang语言来实现的。
参考: [1] 应用密码学 (卓越工程师计划) 张仕斌 编著
1. 对明文进行分组-> 每8字节为一组
2. 对明文进行IP置换,接下来就像轮结构变换了
3. 轮结构变换
公式: Li = R(i - 1), Ri = L(i - 1) ^ F(R(i - 1), Ki)
其中L是左边32bit,也就是低32bit,R为高32bit,这里采用大端表示。
F为轮加密函数,包括如下
1. R(i - 1)进行E盒拓展为48bit
2. 与子密钥进行异或
3. 再进行S盒子压缩为32bit
4. 再对这32bit进行P盒置换
经过一次轮变化输出的32bit进行与L- i异或的到Ri, 而Li则为 R(i - 1)
依次不断重复以上轮加密。
但由于涉及每论结构变换的时候,子密钥都要得重新生成,
子密钥生成过程如下:
1. 经过置换选择PC - 1从64bit变换至56bit,将8bit的校验位去掉。
2. 的到的数据分成两组,C0和D0,各28bit
3. C0与D0分别循环左移,得到C1和D0组装为56bit进行置换选择PC - 2的到子密钥1
4. 再对C1和D1的到C2和D2分别循环左移组装为56bit进行置换选择PC - 2的到子密钥2
不断重复上面步骤16次,即可得到16轮次的子密钥。
再采用这些子密钥作为轮结构变换的每轮的子密钥,经过16论后,即可获得加密后64bit的密文了。
经过16轮加密后,32bit交换组装为64bit,再进行IP逆向置换。
DES加密原理
与加密原理相同,唯一不同的地方就是生成子密钥后,在轮加密的使用顺序相反。
Arch linux
Linux version 5.12.12-arch1-1 (linux@archlinux)
Golang
go version go1.16.5 linux/amd64
为了能够更好的调试,下面我增加了两个主要函数,binStrToIntB和PrintInt64B,binStrToIntB功能是将字符串以大端方式转化为64bit的数值类型,PrintInt64B是将64bit的数值类型以大端方式进行打印出来,也就是左边为低位,右边为高位,方便后续调试与查看。
测试如下
IP置换表中的值代表是第几bit的值,采用目前第几个bit索引值i1 进行查IP置换表后得到bit索引 i2,再根据这个i2查本身自己对应的该bit位,替换当前 i1位置的bit值。
根据教科书上的例子进行编写与测试
IP置换实现
测试:数据来自教科书
通过得到的R32 bit进行E盒拓展置换。
从32bit拓展到48bit,将该eBox表中对于的bit位放入该索引bit位置中
实现代码如下
测试
将E盒拓展的48bit结果与子密钥异或传入S盒置换中。
S 盒压缩,将48bit压缩为32bit
将48bit分为8组,每组6bit
该组的第一个bit位与第6个bit位 组成S盒行号
中间4bit位 组成S盒列号
计算公式:
r = b1 * 2 + b6
c = b2 << 3 + b3 << 2 + b3 << 1 + b4
根据行号和列好查询的到4bit的二进制数,对该二进制数进行大端处理即可完毕S盒
测试如下
原理与之前的IP置换一样,只是位数和表不同。
测试
子密钥匙生成-过程
子密钥生成部分,获取64bit的密钥后,经过PC1置换,获取56bit有效位,分成两组28bit,分别C0,D0。
C0,D0通过循环左移得到C1,D1,组装在一起,经过PC2置换得到第一轮子密钥。
C1与D1经过循环左移,得到C2,D2,组装在一起,经过PC2置换得到第二轮密钥,以此类推,得到下一轮密钥。
子密钥匙生成-置换选择PC1
将64bit的密钥取出56bit的有效位。
子密钥匙生成-循环左移
经过PC1置换后,将56bit拆分为C0和D0,各28bit,再经过置换选择PC2。
结尾处理-IP逆置换
IP逆置换,经过16轮变换之后,得到64bit数据,最后一步是IP逆置换。
IP逆置换正好是IP置换的逆。
经过IP逆置换后,即完成本组加密。
整体加密实现
密钥生成器: 负责生成16轮次密钥
单轮次加密
加密实现
代码有点长,思路是先填充为8的倍数长度,依次对没8字节进行分组加密。
先进行16轮所需密钥生成->IP置换-> 16次轮加密->IP逆置换
解密实现
与加密思路一样,唯一不同的地方在于密钥生成后在轮加密使用时的顺序相反。
Des加解密钥完整测试
运行
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。