概念
基本目标
- 保密性
- 完整性
- 可用性
关于密码学的保密性,常用的保密技术包括:
- 防侦收
- 防辐射
- 数据加密
- 物理保密
针对密码学的攻击
-
穷举攻击
-
数学分析攻击
-
基于物理的攻击
-
仅知密文攻击
-
已知明文攻击
-
选择明文攻击 CPA
-
选择密文攻击 CCA
我国的密码
做到好多相关题目,经常分不清,因此专门整理一下
SM4
2006年公布的用于无线局域网的SM4密码算法
是一个分组密码,数据分组长度128bits,密钥长度128bits
加密和密钥拓展均有32轮
加密解密算法结构相同,只是轮密钥顺序不同
ZUC
ZUC即祖冲之算法
用于移动通信3GPP的加密和验证
是一个同步流密码
整体结构分为三层:
- 上层为定义在素域 G F ( 2 31 − 1 ) GF(2^{31}-1) GF(231−1)上的先行反馈移位寄存器
- 中层为比特重组
- 下层为非线性函数F
其本质上是一种非线性序列产生器
SM3
SM3是2010年国家发布的安全杂凑算法
每一组也是512bit
SM2
SM2是国家2010年发布的椭圆曲线公钥密码算法,商用密码体系中用来替代RSA
古典密码
- 置换密码
- 代替密码
- 代数密码
以上三个类型的典型例子是:凯撒密码、维吉尼亚密码、Vernam密码
针对古典密码的破译,常用方法为:穷举分析、统计分析
Vernam密码就是简单的用密钥异或明文得到密文
当密钥长度与明文长度相等时,Vernam密码是理论上无法破译的
(与之相对的概念为计算上无法破译)
分组密码
DES
Len(Key)=64 bits
Len(M)=64 bits
Len(C)=64 bits
def DES(M,Key):
(L0,R0)=IP(M)
//IP
K=SubKeyGen(Key)
// K=16*56 bits
//子密钥生成
for i=0 to 16:
Li=Ri-1
Ri=Li xor f(Ri-1,Ki)
swap(L16,R16)
//16轮后左右部分要交换
C=RIP(L16,R16)
//逆IP置换
return C
def SubKeyGen(Key):
K0=switch_choose1(Key)
// K0 = 56 bits
// (C0,D0) = K0
//选择置换一
//目的是用64位的Key生成56位的K0
for i=0 to 16:
Ci+1=MovLeft(Ci)
Di+1=MoveLeft(Di)
Ki+1=Switch_Choose2(Ci+1,Di+1)
//选择置换二
//两个28位组合成一个56位的子密钥K
return K
def f(R,K):
// R is 32 bits
// K is 56 bits
result=E(R)
//选择运算,输入32位,输出48位
result=xor(result,K)
result = S(result)
//S盒运算
//48位分成6*8
//每一个6位 拆成1+4+1
//对于每个S盒 输入6位输出4位
result = P(result)
//置换运算,作用是扩散混淆
return result
DES的安全问题:
- 密钥太短 2 56 2^{56} 256对于现在的计算力不是太难,可以穷举
- 存在弱密钥
DES中存在一些密钥K,使得子密钥k1=k2=....=k16
注意:对于抗穷举攻击,2DES的效果与DES是一样的,只能使用3DES
2DES在穷举时的复杂度是 2 56 × 2 2^{56} \times 2 256×2
设已知明文M和密文C
穷举 2 56 2^{56} 256个密钥,保存其对M加密的结果以及对C解密的结果
只需要遍历数据库找到两者的交集即可
AES
AES主要由轮函数构成,即S盒变换、行移位和列混淆、圈密钥加组成
Round(State,RoundKey){
ByteSub(State);
//S盒
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,RoundKey);
}
AES不是对合运算,因此解密与加密不是同样的结构
解密的算法应该是将轮函数的逆运算
分组密码工作模式
ECB 电码本模式
直接分组加密,最简单
PCB 明密文链接模式
C i = E ( M i ⊕ M i − 1 ⊕ C i − 1 , K ) C_i=E(M_i \oplus M_{i-1} \oplus C_{i-1},K) Ci=E(Mi⊕Mi−1⊕Ci−1,K)
CBC 密文链接模式
C i = E ( M i ⊕ C i − 1 , K ) C_i = E(M_i \oplus C_{i-1},K) Ci=E(Mi⊕Ci−1,K)
CFB 密文反馈模式
分组密码作为一个系列密码产生器使用
需要一个寄存器R的初始状态 I 0 I_0 I0,和一个密钥K
K加密R后输出低s位,与明文异或后反馈给右移的R
OFB 输出反馈模式
这个也是将分组密码作为一个系列密码产生器使用
需要一个寄存器R的初始状态 I 0 I_0 I0,和一个密钥K
用K将R加密,最右侧的s位作为序列密码密钥输出
这个结果也是R左移后空缺的内容
CTR 计数器模式
加密过程:
O i = E ( T i , K ) C i = M i ⊕ O i O_i=E(T_i,K)\\ C_i=M_i \oplus O_i Oi=E(Ti,K)