密码学的期末复习
1 DES
1.1 简介
用56位的密钥加密64位的明文数据,将所有的被加密后的64位明文数据块串联在一起即为密文输出
- 对称密码体制
- 分组加密算法
- 每一组长度为64位
- 密钥长度为64位,但是实际上只有56位参与运算
- 第8、16、24、32、40、48、56、64位是校验位
1.2 算法概述
1.2.1 总体结构
- 输入64位明文
- 初始置换,将输入的64位明文经初始置换表置换后分为2个32位长度的L0、R0部分输出
- 16轮轮函数迭代处理
- 逆初始置换
- 输出64位密文
1.2.2 单轮结构
以第一轮为例
- 将输入的数据等分为左右两个部分
- 将输入的右侧数据
R0
直接发送到输出的左侧部分,即L1=R0
- 轮函数根据右侧数据
R0
和子密钥subkey
,计算出结果 - 将上一步所得的结果与左侧数据
L0
进行异或,并将所得的结果作为加密后的右侧数据即R1
- 之后依次轮替进行
1.3 加密步骤1:初始IP置换
利用初始置换表对明文进行顺序打乱,得到一个乱序的64位比特序列
-
初始置换表是给定的
58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7
1.3.1 输入与输出
- 输入:64位明文
- 输出:两部分的32位经过置换的密文(不是最终密文)
1.4 加密步骤2:子密钥生成
在DES的每一轮中,需要从56位密钥中产生出不同的48位子密钥。也就是说,在DES整个加密算法中,需要从56位的原始密钥中,扩展出16个48位的子密钥
-
置换:主要操作方法类似于初始IP置换
57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 - 目的是为了去掉原始长度为64比特中的8比特的校验值
- 置换出的结果分为左右两部分,各为28比特
-
循环左移:根据轮数对这两部分分别循环左移
轮数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 -
压缩置换:从第2步
循环左移
得到的两组28位的数据(共56比特)中选出48位作为子密钥14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32
1.4.1 输入与输出
- 输入原始长度为64位的密钥
- 去掉8位校验值(第1步,带有置换操作)
- 循环左移,长度未变
- 压缩,将56位比特序列压缩为48位比特序列
1.5 加密步骤3:轮函数
- E扩展:32->48
- 异或:48->48
- S盒:48->32
- P置换:32->32
1.5.1 轮函数步骤1:E扩展
- 目的:将32位输入比特序列扩展为48位比特序列输出
- 对象:
R0
(1.3中经过初始IP置换输出的R0
)
32 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
4 | 5 | 6 | 7 | 8 | 9 |
8 | 9 | 10 | 11 | 12 | 13 |
12 | 13 | 14 | 15 | 16 | 17 |
16 | 17 | 18 | 19 | 20 | 21 |
20 | 21 | 22 | 23 | 24 | 25 |
24 | 25 | 26 | 27 | 28 | 29 |
28 | 29 | 30 | 31 | 32 | 1 |
1.5.2 轮函数步骤2:异或
经过E扩展(1.5.1)输出的48位比特序列
与
子密钥
1.5.3 轮函数步骤3:S盒
将1.5.2得到的48位数据送入8个S盒,进行代替运算
- 48位输入分为8个6位分组
- 每个S盒有6位输入4位输出
操作步骤
- 提取原始数据的头尾数据,转化为十进制数,作为行
- 提取原始数据的中间数据,转化为十进制数,作为列
- 在表中定位到对应数据,将该位置上的数据转换为二进制
1.5.4 轮函数步骤4:P盒
16 | 7 | 20 | 21 | 29 | 12 | 28 | 17 |
---|---|---|---|---|---|---|---|
1 | 15 | 23 | 26 | 5 | 18 | 31 | 10 |
2 | 8 | 24 | 14 | 32 | 27 | 3 | 9 |
19 | 13 | 30 | 6 | 22 | 11 | 4 | 25 |
最后将经过P盒置换的结果与L0
进行异或,作为R1
1.6 加密步骤4:逆置换
2 AES
2.1 简介
用128/192/256位的密钥加密128位的明文,生成128位的密文
- 密钥长度的不同带来的是循环轮数的不同
- 128位密钥循环10轮
- 192位密钥循环12轮
- 256位密钥循环14轮
2.1.1 明文字节排列算法
从上至下,从左至右
1 | 5 | 9 | 13 |
---|---|---|---|
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
4 | 8 | 12 | 16 |
2.2 算法概述
- 初始变换
- 9轮循环运算
- 字节代换
- 行移位
- 列混淆
- 轮密钥加
- 1轮最终轮
- 字节代换
- 行移位
- 轮密钥加
2.3 加密步骤1:初始变换
将明文矩阵(4*4)与子密钥矩阵进行异或
2.3.1 明文字节排列为输入状态
从上至下,从左至右
1 | 5 | 9 | 13 |
---|---|---|---|
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
4 | 8 | 12 | 16 |
2.4 加密步骤2:9轮循环运算
2.4.1 轮函数步骤1:字节代换
通过S盒转换,将原始数据代换为S盒中的数据
操作方法为
- 前面1位为所在行,后面1位为所在列
- 定位即可
2.4.2 轮函数步骤2:行移位
- 第1行保持不变
- 第2行向左移动1个字节
- 第3行向左移动2个字节
- 第4行向左移动3个字节
2.4.3 轮函数步骤3:列混淆
输入矩阵与给定矩阵相乘
2.4.4 轮函数步骤4:轮密钥加
异或
2.5 密钥扩展
密钥扩展是以列为单位计算的
计算方法由列数i是否是4的倍数决定
- 注:第1列为W0
-
如果i不是4的倍数,那么第i列由如下等式确定
W[i] = W[i-4]⊕W[i-1]
-
如果i是4的倍数,那么第i列由如下等式确定
W[i] = W[i-4]⊕T(W[i-1])
- T函数包括
- 字循环:将1个字中的4个字节循环左移1个字节
- [1,2,3,4] -> [2,3,4,1]
- 字节代换:将字循环的结果使用S盒进行字节代换
- 轮常量异或:将上述步骤所得结果与轮常量Rcon[j]进行异或,其中j表示轮数
- 字循环:将1个字中的4个字节循环左移1个字节
- T函数包括
3 RSA
公钥加密算法
3.0 数学
3.0.1 同余≡
给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即(a-b)
mod m
=0,那么就称整数a与b对模m同余,记作a
≡ b
(modm
),同时可成立a
mod m
= b
a
≡ b
(mod m
)仅可推出b
= a
mod m
3.0.2 欧拉函数
任意给定正整数n,计算在小于等于n的正整数之中,与n构成互质关系的值就叫做欧拉函数,以φ(n)表示
-
如果n可以分解成两个互质的整数之积,即n=p*q
则φ(n) = φ(p)φ(q)
-
φ(n) = (p-1)(q-1)
3.0.3 模反元素
欧拉定理在此处指的是:如果两个正整数a和n互质,则
a^φ(n)≡1(modn);a的φ(n-1)次方
3.1 加密步骤
-
随意选择两个大质数p、q,并计算乘积n=p*q
-
计算n的欧拉函数:φ(n) = φ(p)φ(q) = (p-1)(q-1)
-
选一个与φ(n)互质的整数e
- e介于1与φ(n)之间
- e通常取65537
-
计算出e对于φ(n)的模反元素d
ed-1=kφ(n) a^φ(n) = 1(mod n);a的φ(n-1)次方
-
公钥(e,n):明文M,密文C
M^e mod n = C
-
私钥(d,n)
C^d mod n = M
看不下去了看不下去了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律