根据SCNU斌头老师课件及《密码编码学与网络安全——原理与实践(第七版)》整理
整理者:0.H.P
零、基本概念
0.1 三大目标(C.I.A)
- 机密性/Comfidentiality(防止数据泄露)
数据机密:信息不能被非授权者泄露
隐私性:确保个人信息哪些可以被怎样操作,向哪些人公开 - 完整性/Integrity(防止数据被篡改)
数据完整:信息、程序能被特定授权改动
系统完整:系统以预定功能执行,避免被非授权者操作 - 可用性/Availability(确保资源可用)
确保系统能够工作,不能拒绝授权者
0.2 两个概念
- 认证性/Authenticity:一个实体具备可被验证可被信任的特征;于信息接收方而言:接受的信息及来源是正确的。
- 可追溯性/Accountability:实体的行为可以被唯一追踪。
0.3 OSI安全框架
目的:评价一个机构的安全需求,对不同安全产品进行选择评价,管理员制定某种系统方法以定义需求和满足的措施,且有以下概念。
- 安全攻击:危害信息系统安全的行为
被动攻击:对传输进行窃听和检测
主动攻击:对数据流进行篡改或伪造数据流 - 安全服务:加强数据处理系统和传输安全性服务,有:认证(包括对等实体认证,如TCP连接传输;数据源认证,如UDP传输)、访问控制、数据保密、数据完整、不可否认(防止发送或接收方否认自己的通信行为)、可用性。其目的是用安全机制进行反攻击。
- 安全机制:检测、阻止攻击;恢复被攻击的系统为正常状态的过程或实现设备。(机制提供服务)
0.4 攻击surfaces与攻击树
攻击surfaces实例:
开放端口、接口、服务、工程师、雇员等.
分类:软件、网络、人
攻击树:
根:攻击目标
分支结点:方法,或者子目标
叶子结点:攻击初始化
0.5 网络安全模型
保证安全的方法包括以下几点:
- 被发送的信息的相关交换;如将信息加密
- 发送与接收双方共享秘密信息;如密钥,加密算法等
- 可靠的第三方,用于分配秘密信息,仲裁等。可选。
设计安全服务}包含以下四点:
- 算法:执行安全传输的相关算法
- 算法产生的秘密信息
- 秘密信息的共享方式
- 指明协议,利用算法以及秘密信息实现安全服务
0.6 密码学基本概念
两个定义:
1.密码编码学
2.密码分析学
方法:(攻击强度依次递增)
- 唯密文攻击:用已知密文恢复出明文或者密钥
- 已知明文攻击:从已知密文和部分明文-密文对中分析明文
- 选择明文攻击:从任意明文-密文对中攻击
- 选择密文攻击:从不同的密文,恢复对应解密的明文(用于公钥体制)
- 穷举法
0.6.1 密码系统
密码系统公式表示:
加密:E(M,K)=C
解密:D(C,K)=M
且有:D(E(M,K),K)=M
秘钥空间:秘钥K的取值范围,且所有算法的安全性都基于密钥安全性,而非算法细节。
0.6.2 密码体制分类
-
单钥体制(对称算法):发送方与接收方的密钥相同
加密方式:流密码(明文按位加密);对称密码(明文按分组加密) -
双钥体制(公钥算法):发送方与接收方的密钥不同
用于加密:
加密:E(M,public key)=C
解密:D(C,private key)=M
且有:D(E(M,public key),private key)=M
用于认证:M=E(D(M,private key),public key)
0.6.3 古典密码
两大构造模块:
1.代换/substitution:明文被其他字符代替 混淆
2.置换/Permutation:明文序列改变 扩散
3.乘积密码(为现代密码学打下基础):迭代使用代换和置换构造算法,即是的网络,简称SPN
一、数论
1.1 数论基础
1.2 伽瓦罗域
(1) 元素集合:,即 [0,256)
(2) 元素表示形式:
其中:
(3) 加法操作:异或运算(XOR),且(F,+)成群
(4) 减法操作:与加法相同
(5) 乘法操作:位移和异或,且成群
-
:
A左移一位:当最高位为0时,结束;当最高位为1时,结果异或283(十进制),其中:283表示为,称不可约多项式。也可以用其他,不一定是283. -
:
将B分解为若干个2的组合
(6) 除法
多项式除法,无借位操作。(跟CRC校验码的计算相同)
#multilpy in GF(2^8)
def mul(a,b):
r=0
while b:
if b%2:
r=r^a #add operation : XOR
b=b>>1
if a&int('10000000',2)==0: #first bit's value = 0
a=a<<1
else: #first bit's value = 1
a=a<<1
a=a^283
return r
#compute the max index number which < 2^count
#return count, from 0
def highest_bit(n):
count = 0
while n:
count+=1
n=n>>1
return count-1
#division about polymerization
#return quotient and remainder
def div(a,b):
if a==b:
return 1,0
if a<b:
return 0,a
a_bit = highest_bit(a)
b_bit = highest_bit(b)
result = 0
while not a_bit<b_bit:
move=a_bit-b_bit
temp=b<<move
result=result+(1<<move)
a=a^temp
a_bit=highest_bit(a)
return result,a
二、对称加密
2.1 AES算法
AES算法:一种采用对称密钥对数据分组进行加密和解密的算法。
参数:数据分组:每组128bits;密钥:128、192、256bits。
基本结构如下(以128bits密钥为例):
简单描述:便是数据分组首先经过与密钥计算,后经过十轮加密,每一轮的密钥也都不同,最后输出数据。
每一轮的加密经过以下几个过程:(第十轮只执行前三步)
(1) 字节代换(SubBytes):用一个S盒代换每一字节的值。
(2) 行位移(ShiftRows):置换过程
(3) 列混淆(MixColums):利用的算数特性进行代换
(4) 轮密钥加(AddRoundKey):分组与密钥XOR运算
2.1.1 字节代换 (SubBytes)
该步骤,用一个 S 盒 (16*16 的矩阵), 将分组的每一个字节进行替换。替换 时,将每字节的值分为高四位与低四位,然后对应于 S 盒的索引进行替换。(解密 时,用逆 S 盒即可)。例如:输入 95,返回 2A。
S盒的构造方法:
(1) 按字节升序初始化 S 盒。第一行是 00,01...0F... 第十六行是 F0...FF。
(2) 将每个字节求在 GF(28) 中的逆元。
(3) 每一字节进行如下运算。
2.1.2 行位移(ShiftRows)
将16个字节编排成4*4矩阵,第一行按字节单位左移0位;第二行左移1字节;第三行左移2字节;第四行左移3字节。
例如:
2.1.3 列混淆 (MixColums)
将上述计算后的矩阵再乘以一下矩阵。即按一下计算方式计算
2.1.4 轮密钥加(AddRoundKey)
将128bits数据与每一轮的密钥异或运算,得到新的数据值。
以下是扩展每一轮的密钥算法。
此图中是初始密钥128bits,按以下三个步骤进行拓展,最后输出44个32bits的拓展密钥,每一轮用128bits,供十轮之用。
的构成是将矩阵按列拼接而得,是8bits数据,拼接后是32bits数据。构造扩展密钥时,
主要用以下函数进行扩展,函数包括以下几步
(1) 将每一个字中的四个字节左移一个字节
(2) 用S盒进行字节代换
(3) 用轮常量异或运算
2.2 工作模式
- 电码本模式/ECB:直接将分组与同一密钥加密
- 密文分组连接模式/CBC:将分组与上一分组异或后再加密,K仍然相同
- 密文反馈模式/CFB:将明文分为每组s位。首先用一初始值,用K加密后,得到b位数据,
然后取前面s位,与明文异或得到密文,且作为下一分组的初值传入。传入后,将s位的数据左
移b-s位得到b位数据参数。以此循环。每次K相同- 输出反馈模式/OFB:用一个初值与K加密,然后与分组异或,并且作为下一分组加密值的参数传入
- 计数器模式/CTR:用一个随机数,与密钥加密再与分组异或,然后将随机值+1用于下一分组的计算
三、非对称加密
3.1 RSA
算法步骤
- 选择两个素数p和q
- 计算n=p*q
- 计算
- 选择e与互素且小于
- 计算e模的乘法逆元d
- 得到公钥(e,n),私钥(d,n)
加密时:
解密时:
3.2 攻击RSA
大致攻击角度:暴力穷举,计时攻击,数学攻击(分解p和q)
数学攻击的三个角度:
(1) 分解n得到p,q,求,进而求私钥
(2) 直接确定,求私钥
(3) 直接确定私钥
有以下攻击方法:
- 大整数分解(见第二章:数论)
- 利用素数生成的不合理性:即假若p和q过于接近,直接对n开根号,然后遍历试探。
- 共模攻击:条件:已知两组或以上密文采用相同的模数n进行秘钥生成,且公钥
共模攻击原理:例如已知密文
由以及拓展欧几里得公式可得:
存在使得
由于
所以 - 利用e和d选取的不合理性(太小)分解n
- 选择密文攻击:该方法不用分解参数,利用用户可签名的功能,得知传输的明文攻击方得知密文C,篡改信息为,然后发给解密方。解密方利用私钥对攻击方的信息解密得传给攻击者,攻击者得到,除以2得到明文。
3.3 Diffie-Hellmam密钥交换
[图片上传中...(DH.png-29f7e2-1627718453801-0)]
场景:用户A和B要交换密钥
算法步骤:
1.选定公开参数:一个素数p及其本原根
- 用户A选择临时密钥,计算公开值
- 用户B选择临时密钥,计算公开值
- 接着用户A计算密钥
- 用户B计算密钥
密钥交换协议
该协议利用Diffie-Hellman算法,当然,在通信前通信双方应知模数p以及其本原根,方法之一是用户A选择这两个参数,并将其放在首次通信的信息中,大致算法如图。
中间人攻击
中间人攻击,就是在通信双方A和B中间截获信息的攻击,过程如下
- 攻击方C生成自己的和
- A将发给B,C截获,给B发送,自己计算
- B接收,计算,发给A是
- C截获,计算,并计算发给A
3.4 ElGamal密码体系
与DH类似,利用离散对数的加密机制,算法步骤如下
- 选定素数p以及其本原根
- 用户A有私钥,以p和,生成公钥(,p,),其中
- 用户B利用以上参数对信息加密,选定随机数k,计算并传输密文对()
- 用户利用A得到密文对,恢复成明文:
3.5 椭圆曲线密码学/ECC
3.5.1 基本概念
方程:
为使该方程有意义,需要判别式:.
以此为基础定义一个群,代数集为(所有元素皆为\textbf{点集}),操作为加法。
该判别式保证了任意直线与该椭圆相交,都有三个根(包含三个不同的根和二重根的情况);
除此之外,椭圆曲线还定义了一个无穷远点/零点。(此点为单位元)
3.5.2 群定义
单位元:;有,
逆元:定义,那么P的逆元为.有\
加法的几何描述:
表示为有一条直线相交于该椭圆曲线,有椭圆曲线最高次数是以及判别式得,必有三个交点;
且只有三个不同交点或有二重根两种情况。
该直线交过P和Q,那么必然与椭圆曲线有第三个交点,此交点便是-R.
3.5.3 上的椭圆曲线
p是素数,群操作是模p加法,该群表示为;
加法操作:假若计算,公式如下
是直线斜率
- 假若P=Q;
此时R=P+P=2P,即直线与P点相切,有二重根,用偏导数求斜率求偏导
得 - 假若
得
乘法操作:乘法定义为重复加法
3.5.4 ECCDH
思路与Diffie-Hellmam相同;只是换成在上的操作。用户A产生一个私钥,并计算公钥,G是群上的一点(类似于DH中的)
传给用户B,用户B产生私钥,计算公钥(类似于DH中的)传给A,自己计算作为密钥
A收到B传来的,计算作为密钥。
四、HASH函数
4.1 基本概念
HASH函数:输入变长数据,输出固定位数数据的一种算法。使用压缩函数进行迭代,压缩函数。
分为两类:HASH专用以及对称分组密码算法,其目的是产生数字指纹。
碰撞攻击:不同的信息输入,产生相同的HASH值;即消息
单向性:用A计算HASH(A)可行,用HASH(A)计算A计算上不可行
弱抗碰撞性:寻求任意,使得计算上不可行。
强抗碰撞性:寻求任意对,使得计算上不可行。
理解强与弱:在此强与弱是指要求,即弱抗碰撞是指希望不容易发生的事情不发生,
所以实现此是容易的,称为弱抗碰撞;而强抗碰撞是指希望容易发生的事情不发生,所以实现此是
困难的,是强需求的,称为强抗碰撞。
应用:
1.消息认证:使用带密钥的Hash函数(消息认证码/MAC)实现,MAC函数将密钥与消息作为数据块输入,然后产生哈希值附于消息后面,传送给另一方;接收方利用共享的密钥进行相同操作,验证生成的哈希值与传来的是否一致。是则代表消息是完整的。
2.数字签名:基于非对称密码学,需要被认证的一方用自己的私钥对信息的哈希值加密,认证的一方用公钥解密后得到哈希值,与消息生成的哈希值对比,看是否相等,若是,则证明该签名有效。
4.2 SHA-3
4.3 消息认证码/MAC
认证是用来防止主动攻击,针对开放系统设计的。消息认证是用来验证信息完整性,而消息认证码是用来验
证发送方非冒犯者。目的是实体认证和报文认证。
其算法是输入可变长度的消息以及密钥,输出固定长度的认证码。
构造方法一:Hash函数以某种方式与密钥捆绑
构造方法二:使用对称分组密码,将可变长度的输入,变成固定长度的输入。
4.3.1 基于哈希函数的MAC/HMAC
基本思想:输入密钥和信息,输出固定长度nbits认证码。
整体框架:
算法步骤:
假定消息分组长度为,若秘钥长度l,输出哈希长度为n.
- 若密钥长度大于b,哈希至n位;填充0至b位,得到
- 将与00110110*(b/8)异或
- 将消息接在后面
- 哈希得到n为哈希值
- 填充哈希值至b位
- 将与01011100*(b/8)异或
- 接第(5)步哈希值
- 再哈希的最终结果
4.3.2 基于加密的MAC/CMAC
利用对称分组加密算法(如AES)对消息进行运算,得认证码。
算法步骤:
假定消息分组长度b位,共n组,K为k位加密算法秘钥。为b位常量
1.
2.以此循环至
3.
4.
T是认证码,Tlen是T位长度,是指前Tlen位。
假若消息长度无法整除b,那么填充10*使其可整除b。然后在最后一步用计算,
关于和的生成:
(乘法是伽瓦罗域上的乘法)
4.3.3 认证加密CCM与GCM
CCM=CMAC+AES+CTR,发送方采用先认证后加密模式;接收方采用先解密后认证模式。
通信双方要共享密钥,计数器初始值,临时量,相关数据
发送方算法如下:
1.N,A,与明文拼接,得可模b位的数据
2.然后用K以CMAC得认证值T
3.用K加密,前len(Tag)位与Tag异或
4.对明文进行加密
5.后拼接(3)的数据,传给接收方
GCM=GCTR+GHASH,模式采用先加密后认证(再加密)。以GCTR和GHASH为基本算法模块.
加密函数表示输入密钥K,计数器值ICB,明文X,输出与X一样长的密文Y
算法步骤如下:
1.加入X为空,直接输出空
2.将X分组为(其中n小于或等于128bits)
3.初始化计数器值:
4.即低32位加一后模
5.除了最后一组
6.
7.输出
哈希函数需要哈希秘钥H,以及不定长数据串,输出固定长度(128bits)的哈希值,
算法步骤如下:
1.将数据分组:
2.初始化Y;
3.
4.输出
GCM利用此两个函数,先将明文用GCTR加密,后填充相关参数数据,然后用GHASH哈希,然后在用GCTR加密,最后输出需求长度的验证码。
五、数字签名
数字签名的思路:利用哈希算法与非对称加密算法
5.1 ElGamal数字签名
对于签名的一方A:要有消息哈希值:,素数及其本原根,以及临时私钥,随机数,满足,即K与q-1互素。
计算,类似于ElGamal加密算法。
计算,作用于指数上,所以根据离散对数原理,包含,以及模q-1.计算完毕后,A将作为签名,以作为公钥。
对于认证的一方:收到A的消息、签名及公钥。做出如下计算:
假若那么,认证通过。
5.2 Schnorr数字签名
Schnorr签名采用先计算,在哈希的方法以提高计算效率。
对于签名的一方A:要有两个素数,且,选择整数,
构成公开参数;然后,选取作为私钥,计算为公钥。
产生签名算法如下:
随机生成,计算,计算哈希值;计算
签名便是(e,y);
认证方利用公钥和已知参数进行验证:计算,.
假若,那么,签名认证成功。
5.3 DSA数字签名
首先需要公开参数:素数对,且;
签名方需要私钥,随机数,;
生成公钥
得签名
验证方计算(主要思路是计算到):
需要指数上:
然后计算:若与r相同,即签名成功。
六、认证协议
6.1 弱认证/口令认证
用户传输一个口令,计算机根据该口令验证是否与该用户对应,以此确保用户身份。(例如:登陆操作)
安全性:口令认证主要存在字典攻击(在线,离线);字典攻击即通过穷举字典中的口令,猜测出用户的口令
故此,需要对口令进行加盐哈希操作。
用户将口令填充数据(加盐),然后将整个数据加密,并将“盐”和密文放进口令文件中。然后传输。
每次用户需要被认证时,服务器通过传输过来的口令,从口令文件中得盐再加密,与口令文件中密文比对,看是否一致,以此认证。
这样做的好处是防止重复口令被发现;增加字典攻击难度。
基于口令的秘钥交换:
公共参数:上的生成元。
用户A有口令pw,且产生一个私钥,计算公钥,传送口令和公钥给B。
用户B产生一个私钥,根据公钥以及口令计算秘钥
并将产生的公钥传给A;
A采用同样算法产生密钥
6.2 强认证/质询-应答
认证与被认证双方协商好秘密sk以及加密函数f,每一次用户需要被认证时,系统向用户发送一个质询
(challenge)消息m,用户以作为应答。系统通过验证r来确认用户的身份。
6.2.1 基于硬件
“token”:对消息提供哈希和加密机制,需要硬件支持时间戳,能保存密钥,以及生成同步信息。
- 基于时间戳的单边认证
- 基于随机数(单边认证)
- 基于随机数的双边认证
- 基于哈希函数的双边认证
6.2.2 基于公钥密码体制
- 单边:
- 双边/Needham-Schroeder协议
6.2.3 基于签名
- 基于时间戳
(sign是签名算法)- 基于随机数的单边认证:
- 基于随机数的双边认证:
6.2.4 基于公钥体制认证的秘钥交换协议/HMQV
类似于DH。针对双方A和B:公私钥对
A根据B传输的信息:以及公钥利用自己的私钥与随机数计算密钥:
B根据A传输的信息:以及公钥利用自己的私钥与随机数计算密钥: