密码学——DES加密
DES加密算法
首先,我们讲一下分组密码,顾名思义就是将明文消息分成组来进行加密,也就是说,加密器每次只能处理特定长度的一组数据,这里的"一组数据"就被称之为分组。我们也将每一个分组的比特数就称为分组长度。
我们设想一下,现在有一篇论文想要加密,我们将自己代入分组密码那个时代,计算机算力还不强,很多时候需要人工计算的时候,当我想加密一篇论文,有一种相当稳妥的做法,用毫无规律的密钥对明文进行为加密(实际上就是乱,越混乱越不会被看出来,解密凯撒的一种做法是统计字符数量进行猜测,这也是乱可以解决的),假设这个论文有十万个字,那我可以用十万个毫无规律随机的字母进行凯撒加密,实际效果应该相当好,但加密解密都挺麻烦特别是解密(当然我们不考虑运输密文和密钥会产生的情况),于是又为了简化这样恶心人的解密,同时又不失去混乱的特性,有了分组密码(当然,主要也是那时候加密机还不是电脑,造出来就不好修改了,又不好造太长了),分组密码实际上就是分成等长度的很多组,每个组加密的方式形式都一样。
下面我们讨论再des中一组密码(64bit)的加密
(1)初始置换IP(Initial Permutation)
ip表有8*8=64
当输入明文X后,利用IP置换对明文进行换位处理,得到64bit密文组。我们设其为X'
对X'分成左右两个部分,即分别为32+32或者如表为4*8+4*8(即前四行+后四行)
左边记为L0,右边记为R0
(2)生成子密钥
我们在输入明文时还要输入密钥,长度也为64bit(一切都是为了足够的混乱,64bit中用32bit也会存在规律)
PC_1表置换
PC_1置换实际上是为了去掉密钥K的8的奇偶校验码,并对剩下的56位进行打乱,实际上我们可以分两步进行。
奇偶校验码每八位在第八位上,也就是8,16,24,32,40,48,56,64位
可以发现在PC_1置换中没有这些位置的数字。
最后我们可以得到56位K'
同样,我们将其分为C0和D0,每个是28bit
PS:删除奇偶校验码的原因:我也不确定是否是这个原因,但至少有一点可能吧,明文是不重复的,要进行分组,但是密钥是针对每一组都一样的,奇偶校验码的存在会让密钥”规律“,我们为了安全,不能让密钥存在一丁点规律。(拙见,不必在意)
创建16个Cn和Dn
对于C0和D0进行移位,
进行移位后得到C1到C16,,D1到D16
得到子密钥16个K
16个k分别作用在16个转轮机上,
先有Kn=PC_2(CnDn),CnDn代表着将Dn排在Cn后,即简单的字符串相加(56bit)
PC_2只有8*6=48,也就是有8个位置会没有被选上。不过密钥没有选上倒也无所谓,对信息没有损耗
n有1~16,则有16个K
即16个转轮机
(3)轮函数
转轮机就不介绍了
我们着重谈一下F函数
F函数
1.扩展置换(E盒)
我们有一个E盒,最开始我们将明文分为L0和R0,接下来就需要使用了
R进入E盒,进行扩展,由32位转为48位
可以发现E盒的中间8*4部分是顺序的,左右各多出来两列,这两列是与相邻的格子里的数字有顺序关系,
2.密钥加
E扩展输出的48位数据与48位子密钥进行逐位异或运算,输出48bit
3.代换盒(S盒)
s盒有8个,里面的数字没有规律,每个盒有4*16个数字,对其进行的是查表运算
48bit分为6*8
每六个数字进入一个盒子中
其中第1,6个数字组成一个二进制两位数,可以作为十进制的0~3共四个数,查行数
其中第2,3,4,5个数字组成二进制四位数,可以作为十进制的0~15的某个数,用来查列数
可以查到八个数
这八个数可以分别转为二进制,一个数是4bit,则有4*8=32,相比原来的48位,又进行了压缩
4.置换运算(P盒)
以上4个运算,每次都要运算,一共计算16次
(4)逆初始置换
本文来自博客园,作者:逆世混沌,转载请注明原文链接:https://www.cnblogs.com/nish1hundun/p/17224628.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型