前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DES加解密-简单原理与go语言实现

DES加解密-简单原理与go语言实现

原创
作者头像
i0gan
修改2021-07-01 10:27:58
9410
修改2021-07-01 10:27:58
举报
文章被收录于专栏:I0ganI0gan

注: 这个是最近的工程实践作业,根据书上理解原理后采用golang语言来实现的。

参考: [1] 应用密码学 (卓越工程师计划) 张仕斌 编著

DES加密原理

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置换实现

IP置换表中的值代表是第几bit的值,采用目前第几个bit索引值i1 进行查IP置换表后得到bit索引 i2,再根据这个i2查本身自己对应的该bit位,替换当前 i1位置的bit值。

根据教科书上的例子进行编写与测试

IP置换实现

测试:数据来自教科书

E盒拓展置换实现

通过得到的R32 bit进行E盒拓展置换。

从32bit拓展到48bit,将该eBox表中对于的bit位放入该索引bit位置中

实现代码如下

测试

将E盒拓展的48bit结果与子密钥异或传入S盒置换中。

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盒

测试如下

P盒置换实现

原理与之前的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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DES加密原理
    • 开发环境
      • 代码准备
        • IP置换实现
          • E盒拓展置换实现
            • S盒压缩实现
              • P盒置换实现
              • 完整代码
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档