将被加密明文划分成一个一个的分组,输入n比特明文分组,输出n比特密文分组。
若映射可逆,具有
x
n
!
x^n!
xn! 种替换可能性。
如以下示例,每个4比特输入唯一映射为另一个4比特输出。
2 Feistel密码结构
2.1 什么是Feistel密码结构
1973年由IBM的Horst Feistel首次提出,通过将明文分组分成左右两半部分
- 左半部分:采用替换操作,
- 右半部分:采用基于子密钥的轮函数(包括替换和置换组合操作)进行混淆,
如此经过n轮迭代处理后再重新合并组成密文分组
2.2 Feistel密码结构流程图
将Feistel公式化,首先来看加密过程,
- 每一轮的左半部分是上一轮的右半部分
- 每一轮的右半部分是 (上一轮的右半部分进入一个F操作,且要输入这一轮的密钥
K
i
K_i
Ki ),然后产生的解再与上一轮的左半部分进行异或操作
那清楚了加密的过程,能不能反推解密的公式呢?答案是可以的,由于
R
E
i
−
1
RE_ {i-1}
REi−1等于
L
E
i
LE_i
LEi,所以解密公式的各个变量都是已知的。所以分组密码是可逆的。
用流程图画出来就是这样的:
那F操作(F函数)是不是可逆的吗?但其实F操作没有要求,可逆也可以 ,不可逆也可以。因为加密的时候用的是F操作,解密的时候也是用的F操作,所以在加密解密的F操作都是正操作,也就都没有用到F操作的逆操作。这里面很大的原因还是Feistel的巧妙结构,分为左右两个部分才能使得F操作可以不可逆,如果只有一个部分那就要求F操作必须可逆。右半部分其实是已知继承下来的,可以保留上一轮的特性。
2.3 Feistel密码设计要素
- 分组大小:越大的分组越安全,但减小了加密/解密速率
- 密钥大小 :越长的密钥越安全
- 迭代轮数:越多轮越安全。经典是16轮
- 子密钥生成算法:越复杂越难破解
- 论函数:越复杂越难破解
- 快速软件加密/解密:嵌入式实现,要求快速执行速度
- 容易分析:如果算法能被简明清楚地解释,则容易分析该算法的弱点并因此给出对其强度更高级别的保障。例如,DES 不具有容易分析的性质
3 数据加密标准(DES)
3.1 什么是数据加密标准(DES)
DES是最广泛使用的对称加密方案,由原美国国家标准局 (现在是美国国家标准与技术研究所)于1977年采用。
明文分组长度为 64-bit ,密钥有效长度为56-bit,在基于Feistel网络的基础上,采用16轮迭代,从原始56-bit密钥产生16组子密钥,每一轮迭代使用一个子密钥。
3.2 DES介绍
DES 涉及以下操作:
-
初始置换(通过置换矩阵,输入64bit,输出64bit)
-
轮函数操作(F操作)
- 先将输入的64bit分为左右两半部分,每个部分32bit,下面只对右半部分进行操作
- 扩展运算
E
E
E (输入32bit,输出48bit)
- 与子密钥进行异或操作(输入48bit,子密钥也是48bit,输出48bit)
- 压缩运算
S
S
S(输入48bit,输出32bit)(唯一不可逆的操作)
- 置换运算
P
P
P (输入32bit,输出32bit)
- 与上一轮的左半部分进行异或运算(输入32bit,输出32bit),得到这一轮的右半部分
- 这一轮的左半部分等于上一轮的左半部分(32bit)。这一轮的右半部分(32bit)通过上面的操作已经得到了。
-
子密钥产生算法
- 置换选择1(输入64bit,输出56比特)
- 将56bit分为2个28bit的部分(输入56bit,输出2*28bit)
- 对2个28bit的部分进行循环左移操作(输入2*28bit,输出 2 * 28bit)
- 将2个28bit部分合并成一个56bit(输入2*28bit,输出56bit)
- 置换选择2(输入56bit,输出48bit),得到这一轮的子密钥
- (利用这个子密钥跟轮函数扩展运算后的的48bit进行异或操作)
-
逆初始操作(通过逆置换矩阵,输入64bit,输出64bit)
接下来介绍每一个操作的具体实现
初始置换
DES会有标准的置换矩阵,在实现算法的时候不要改动这些标准的矩阵,虽然改动了也可以完成加解密,但是与其他人通信的时候别人使用标准的置换矩阵就解密不出来了。
初始置换其实是一个矩阵置换(不是映射,这里只是改变了位置)的过程,这里左边是64比特明文输入,下边是标准的置换矩阵,我们需要对明文通过置换矩阵进行初始置换得到右边的矩阵(这里先称为密文矩阵,但其实不是最终的密文矩阵,只是第一步加密得到的)。
比如,置换矩阵的第一行第一列是58,我们在明文矩阵中找到第58个比特,然后放到密文矩阵的第一行第一列;置换矩阵的第一行第二列是50,所以在明文矩阵中找到第50个比特,然后放到密文矩阵的第一行第二列。按照这种方式,一一置换,得到第一次置换的矩阵。
轮函数
轮函数也就是前面Feistel网络的F操作(round function)。将输入的64比特分为左右两半部分,每个部分32比特。
对右半部分数据
R
i
−
1
R_{i-1}
Ri−1 进行如下操作:
- R
i
−
1
R_{i-1}
Ri−1通过选择扩展运算
E
E
E 扩展成48-bit数据
2. 与子密钥
K
i
K_i
Ki异或生成新的48-bit数据
3. 经过压缩运算
S
S
S 变成32-bit数据
4. 进行置换运算
P
P
P (可逆的,跟之前的置换操作原理是一致的)
5. 与左半部分数据
L
i
−
1
L_{i-1}
Li−1进行异或
这一步完成之后,得到的就是下一轮的右半部分,而下一轮的左半部分就从上一轮的右半部分直接继承下来。如此循环。
扩展运算
我们说整个加密过程会先分组为64比特明文的输入,每个64比特再分为左右两部分,每个部分32比特,在论函数的第一步是对32比特进行扩展运行
E
E
E,将32比特通过扩展矩阵变为48比特。
具体过程如下图所示,其实就是添加冗余。可以看到生成的扩展矩阵(48比特)第2列到第5列的值是原封不动加入进来的,第1列和第6列再从原来的32比特矩阵对应取出。(跟前面讲过的初始置换矩阵原理是一致的)
这里需要思考从48比特置换回32比特的操作(多到1)是可逆的吗?其实是可逆的,只需要将冗余去掉就得到原来的矩阵了。
压缩运算
DES中压缩运算S则是非线性的(意思就是不可逆的),而其它运算都是线性的(可逆的)。 压缩运算S不易于分析,提供了更好的安全性。
压缩的总体操作:是将扩展运算后产生的48比特,与子密钥异或操作后还是48比特,再将这48比特分为8个6比特的小组,再通过映射规则(跟之前的置换运算不一样,映射操作是不可逆的)将每个6比特压缩成4比特,这样就变成整体 8*4比特 = 32比特了。
那具体的映射规则是怎么样呢?
前面说的分成8个6比特的小组,我们称为S_1
.
.
.
…
…S_8$一共8个S-BOX,每个S-BOX之下都有一张标准化的表(做算法的时候不要改动这些表,表中最大的值是15,因为最后要转化为4比特),且每个S-BOX的表都是不一样的。这里的规则是这样的:
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
又不知道该从何学起的朋友。**
[外链图片转存中…(img-4E9PGCev-1715592723911)]
[外链图片转存中…(img-IG8Jd3Oa-1715592723911)]
[外链图片转存中…(img-qfQxpidR-1715592723911)]
[外链图片转存中…(img-9lU7kEaM-1715592723911)]
[外链图片转存中…(img-o6IOneuL-1715592723911)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!