现代密码学
现代密码学
电子科技大学MOOC+B站up可厉害的土豆
仅覆盖考试内容
一、概述
1.密码学的基本概念
信息安全的基本属性/密码学可解决的信息安全问题:
- 机密性:也就是别人看不到或者看不懂,保证信息为授权者使用而不泄露给未经授权者
- 完整性:就是数据完整性和系统完整性
- 不可否认性:发送方和接收方都不能抵赖进行的传输
- 认证:就是消息来源和通信实体的真实性
- 可用性:保证系统随时为授权者服务,不会出现非授权者滥用却对授权者拒绝服务的情况
- 其它:可靠性,可控性,审计
密码算法按功能分类:
- 加密算法:用于解决机密性
- 杂凑函数:用于解决完整性
- 数字前面:用于认证和不可否认性
按密钥的使用方式不同分类:
- 对称密钥密码:加密密钥与解密密钥相同。如:分组密码,流密码
- 非对称密钥密码体系:加密密钥与解密密钥不同。如:公钥加密,数字签名
攻击手段的分类:
-
被动攻击
- 定义:试图了解或利用系统的信息但是不影响系统资源
- 消息泄露
- 流量分析
-
主动攻击
- 定义:试图改变系统资源或影响系统运作
- 假冒
- 重放
- 消息篡改
- 拒绝服务
密码算法的组成:
- 明文M
- 密文C
- 密钥k
- 加密函数E
- 解密函数D
密码算法的需求:
- 可逆:算法使用者可以将密文恢复成明文
- 不可逆:攻击者无法将密文恢复成明文
一个好的密码体制至少应满足的两个条件:
- 已知明文m和加密密钥时,进行加密很容易;已知密文c和解密密钥时,进行解密很容易;
- 在不知道解密密钥时,不可能由密文c恢复出明文m
2.古代密码体系
2.1中国古代密码
-
中国民间艺术:
- 图画传情
- 会意诗
- 藏头诗
- 叠痕法
- 漏格板加密法
-
中国古代军事密码:
- 阴符
- 阴书
- 反切法
- 加乱型
-
中国近代密码:
- 密本型
- 加乱型
2.2 外国古代密码
-
代替密码
- 兽栏法
- 跳舞的小人
- 莫斯电码
- 凯撒密码:用明文的后面第三个字母替代
-
换位密码
-
密码机
3.密码分析学
密码分析学的目标:
- 恢复合法密文相应的明文
- 恢复密钥
Kerckhoffs假设: 假定密码分析者和敌手知道所使用的密码系统。即密码体制的安全性仅依赖于对密钥的保密,而不应依赖于算法的保密。
攻击密码体制的方法:
-
穷举攻击:通过试遍所有的密码来进行破译
对抗:可增大密钥的数量
-
统计分析统计:通过分析密文和明文的统计规律来破译
对抗:设法使明文和密文的统计规律不一样
-
解密变换攻击:针对加密变换的数学基础,通过数学求解设法找到解密变换
对抗:选用具有坚实的数学基础和足够复杂的加密算法
密码体制的攻击(从上到下攻击强度逐渐增大):
- 唯密文攻击:密码分析者仅知道一些密文
- 已知明文攻击:密码分析者知道一些明文和相对应的密文
- 选择明文攻击:密码分析者可以选择一些明文,并得到相应的密文
- 选择密文攻击:密码分析者可以选择一些密文,并且得到相应的明文
无条件安全(不可破译的) :无论截获多少密文,都没有足够信息来唯一确定明文,则该密码是无条件安全的,即对算法的破译不比猜测有优势。
计算上安全:使用有效资源对一个密码系统进行分析而未能破译,则该密码是强的或计算上安全的。
密码算法只要满足以下两条准则之一,我们就说密码算法是安全的:
- 破译密文的代价超过被加密信息的价值
- 破译密文所花的时间超过信息的有用期
4.古典密码算法
4.1 置换密码
置换密码原理:
- 把字母的顺序进行变换
- 明文的字母保持相同,但顺序被打乱了
4.2 代替密码
代替密码原理:
- 代替(Substitution)密码构造一个或多个密文字母表,然后用密文字母表中的字母或者字母组来代替明文字母或字母组,各字母或字母组的相对位置不变,但其本身的值改变了。
- 分为单表代替密码和多表代替密码
单表代替密码可分为:
-
加法密码
加密 y=x+k(mod 26),解密 x=y-k(mod 26)。明文x,密文y,密钥k
例如:凯撒密码,k=3 -
乘法密码
加密 y=kx(mod 26),解密 x=k-1y(mod 26)。明文x,密文y,密钥k。
注意:密钥需满足条件(k,26)=1,否则不存在k **-1** -
仿射密码
加密 y=ax+b(mod 26),解密 x=a-1(y-b)(mod 26)。密钥 a,b。条件 (a,26)=1
单表替代的统计分析:
- 单表替代的特点是相同的明文被加密成相同的密文,这使得统计分析成为可能。
- 英文中字母出现频率是有规律的,只要能够收集到足够多的密文,通过统计就能够很容易地进行密码的破译:
多表代替密码:Vigenere(维吉尼亚)密码
多表代替在数学上的描述:
困难点:如何在mod26的情况下,求A的逆矩阵
- 求|A|和|A|-1
- 求A的伴随矩阵A*
- A-1 = |A|-1A*
二、流密码
1.流密码的基本概念
一次一密:
- 一种理想的加密方案。密钥随机产生,而且只使用一次。
- 对于计算机使用的01串加解密来说,就是随机生成一串01密钥。密钥与明文进行异或得到密文,密钥与密文进行异或得到明文。
- 优点: 无条件安全。加密和解密算法均为加法运算,效率高
- 缺点: 密钥长度至少与明文长度一样长,密钥共享困难。不实用
流密码:
- 一次一密有密钥过长,共享困难的缺点。因此密码学家们想,能不能将共享的密钥缩短,并且将这一小段密钥用在全部明文上。
- 明文消息按字符或比特逐位加密
- 流密码也称为序列密码(Sequence Cipher)
- 流密码主要是基于硬件实现的
流密码的基本思想:
现在使用的流密码通常是同步流密码:内部记忆元件的状态σi,独立于明文字符的叫做同步流密码,否则叫做自同步流密码。
在同步流密码中,内部记忆原件的状态独立于明文字符,因此可将同步流密码的加密器分为密钥流产生器和加密变换器两部分。
流密码的需求:
-
因为一次一密密码是加法流密码的原型,并且无条件安全。因此,如果密钥流产生器能随机产生密钥的话,那么加法流密码就退化成了一次一密密码。当然这是很难做到的,因此退而求其次。
-
一个好的滚动密钥生成器,应使得密钥经其扩展成的密钥流序列具有如下性质:
- 极大的周期
- 良好的统计特性
- 抗线性分析,具有高线性复杂度
- 足够混淆
- 足够扩散
- 抵抗不同形式的攻击
2.有限状态自动机
有限状态自动机时具有离散输入和输出(输入集和输出集均有限)的一种数学模型,由以下3部分组成:
- 有限状态集
- 有限输入字符集
和有限输出字符集
- 转移函数
转移图表示:
矩阵表示:
密钥流产生器:
-
可看作参数为k的有限状态自动机。
由一个输出符号集Z、一个状态集Σ、两个函数φ和ψ,以及一个初始状态σ0组成。
-
状态转移函数φ:σ0->σi+1,将当前状态σ0变为一个新状态σi+1。
-
设计密钥流产生器的关键在于:找出适当的状态转移函数φ和输出函数ψ,使得输出序列z满足密钥流序列z应满足的随机性条件,并且要求在设备上是节省的和容易实现的。
3.二元序列的伪随机性
3.1 前置知识
二元序列的定义: 一个无限01串
游程的定义: 011110被称为1游程,10001被称为0游程
自相关函数: 用于表示一个序列和它的平移位序列的关系
3.2 伪随机性
Golomb伪随机公设:
- 在序列的一个周期内,0与1的个数相差至多1(也就是序列中0和1出现的概率基本上相同)
- 在序列的一个周期内,长为i的游程占游程总数的1/2i(i=1,2,......),且在等长的游程中0和1的个数相同(也就是每个位置上0和1出现的概率相同;注意,长度为i的游程在伪随机序列中符合指数分布)
- 异相自相关函数是一个常数(也就是说通过序列与其平移后的序列做比较,不能给出其他任何信息)
伪随机序列的定义:
除此之外,伪随机序列还应满足以下三个条件:
- 周期p要足够大,如大于1050
- 序列{ai}i≥1的产生很容易
- 当序列{ai}i≥1的任何部分暴露时,要分析整个序列,提取产生它的电路结构信息,在计算上是不可行的,称此为不可预测性。
4.线性反馈移位寄存器
4.1 反馈移位寄存器
反馈移位寄存器:
- 移位寄存器是流密码产生密钥流的一个主要组成部分。
- GF(2)上一个n级反馈移位寄存器由n个二元存储器与一个反馈函数 f(a1, a2, ..., an) 组成,如下图所示
-
反馈函数:
- 反馈函数的初始状态由用户确定
- 反馈函数 f(a1, a2, ..., an) 是n元布尔函数,即函数的自变量和因变量只取0和1这两个可能的值
- 函数中的运算有逻辑与、逻辑或、逻辑补等
反馈移位寄存器的例子:
4.2 线性反馈移位寄存器
线性反馈移位寄存器LFSR:反馈函数是线性的
Ci只能取0或1。0相当于电路断开,1相当于电路连接。
LFER实例:
LFSR的性质:
5.m-序列
5.1 m-序列的判定条件
线性移位寄存器的多项式表示:
生成函数:
生成函数的性质:
不可约多项式:
m-序列产生的必要条件:
m-序列产生的充要条件:
5.2 m-序列的伪随机性
m序列满足Golomb伪随机公设
5.3 m-序列的安全性
主要考虑m序列递推关系式的安全性:已知一段序列,如果知道其反馈多项式,就可以将其后的序列依次求出。这是不安全的。
已知序列,能否获得相应的反馈多项式(或线性递推式)呢?
主要有两种方法:
-
解方程方法:要求已知是n位线性移位寄存器,并且知道连续2n位,即可用解线性方程组的方法得到反馈多项式。具体又分为普通算式法和列矩阵法。
-
线性反馈移位寄存器综合解:Berlekamp-Massey算法(不考)
简单来说就是归纳法。
三、分组加密算法
1.分组密码概述
分组密码定义:
-
明文序列是一个比特流,和流密码的区别就是分组密码是一组一组的加密,设分组长度为n
-
密文分组长度是m,这种密码实质上是字长为n的数字序列的代换密码
-
通常取n=m
若n<m:有数据拓展的分组密码
若n>m:有数据压缩的分组密码
分组密码的设计问题:分组密码的设计问题在于找到一种算法,能在密钥控制下从一个足够大且足够好的置换子集中,简单而迅速地选出一个置换,用来对当前输入的明文的数字组进行加密变换。
安全性设计原则:
- 混淆原则:
就是将密文明文密钥之间的统计关系和代数关系变得尽可能复杂 - 扩散原则:
让明文中的统计规律和结构规律散射到相当长的一段统计中去
分组密码算法应满足的要求:
- 分组长度n要足够大
- 密钥量足够大
- 由密钥确定置换的算法要足够复杂
- 加密和解密运算简单
- 数据拓展
- 差错传播尽可能小
分组密码的实现原则:
-
软件实现的原则:
使用子块和简单的运算,避免用以软件难以实现的逐比特置换
-
硬件实现的原则:
加密解密可用同样的器件来实现
2.SP网络
S指的是替代,P指的是置换,SP网络又称为代换网络。
SP的定义:
分组不能太小:分组过小则等价于古典的代换密码,容易通过明文的统计分析而被攻破
分组也不能太大:分组太大会导致密钥过长,难以处理
代换网络:
代换盒(S盒): 在密码设计中,可选 n=r*n0,将设计n个变量的代换网络化为设计n0个较小的子代换网络,每个子代换网络只有n0个输入变量,称每个子代换网络为代换盒。
S盒的设计准则:
3.Feiste密码结构
-
乘积密码是指顺序地执行两个或者多个密码系统,使得最后的密码强度高于每个基本密码系统产生的结果
-
输入是分组长为2w的明文和秘钥K,每组明文分为两部分L0和R0,在进行完n轮迭代后,左右两半再合并在一起产生密文分组(记住通式):
Li = Ri-1
Ri = Li-1 ⊕ F(Ri-1, Ki)
Ki是第i轮用的子密钥,由加密密钥K得到 -
Feist解密过程是和加密过程一样的,只不过采用密文作为输入,但是使用的子秘钥Ki的次序和加密过程相反
4.分组密码的工作模式
【【分组密码的工作模式】|分组密码 | 密码学 | 信息安全 | ECB | CBC | CFB| OF B| CTR|】
- 电码本模式ECB:用相同的密钥分别对明文单独进行加密
- 密文分组链接模式CBC:将前一个密文块与当前明文块进行异或运算后再加密。第一明文块和初始向量进行异或。
- 密文反馈模式CFB:将前一个密文块作为输入进行加密,生成一个密钥流,再与当前明文块进行异或运算得到密文块
- 输出反馈模式OFB:将前一个加密算法的输出作为输入进行加密,生成一个密钥流,再与当前明文块进行异或得到密文块
- 计数器模式CTR:每个明文分组都与一个经过加密的计数器异或。对每个后续的分组,计数器+1
工作模式定义: 根据不同的数据格式和安全性要求,以一个具体的分组密码算法为基础构造一个分组密码系统。
主要工作模式:
电码本模式ECB:
-
定义:就是各个分组是独立的,加密方式相同,可同时进行。
-
优点:
- 实现简单
- 不同分组可并行加密,用硬件实现时速度很快
-
缺点:
- 相同明文分组对应相同密文分组
- 不能隐蔽明文分组的统计规律和结构规律,不能抵抗替换攻击
-
应用:适用于消息较短时
- 用于随机数的加密保护
- 用于单分组明文的加密
密码分组链接模式CBC:
-
定义:先将明文分组与上一次的密文块异或,然后加密处理。这种模式必须选择一个初始向量C0=IV用于加密第一块明文;
加密过程:ci = Ek (mi ⊕ ci-1)
解密过程:mi = Dk(ci) ⊕ ci-1
-
CBC模式的特点:
- 明文块的统计特性得到了隐蔽:各密文块不仅与当前明文块有关,而且还与以前的明文块及初始化向量有关
- 具有有限的错误传播特性:一个密文块的错误将导致两个密文块不能正确解密
- 具有自同步功能:密文出现丢块和错块不影响后续密文块的解密.若从第t块起密文块正确,则第t+1个明文块就能正确求出
-
优点:每个密文块的加密依赖前一个密文块,具备数据完整性保护
-
缺点:错误会传播、不适合并行处理
-
应用:适用与常规文件加密、非实时加密等场景
密码反馈模式CFB:
-
定义:若待加密消息需要按字符、字节或比特处理时,可采用CFB模式(比如数据库加密要求不能改变明文的字节长度的时候就需要以字节为单位进行加密),CFB模式同样需要初始向量IV
-
特点:
- 相同明文:和CBC模式一样,改变IV同样导致加密结果不同
- 链接依赖性:类似CBC,重排密文组会影响解密
- 错误传播:一个或多个比特错误出现在任意一个r比特的密文组中会影响这个组和后继[n/r]个分组
- 错误恢复:类似CBC,也是自同步,但是需要[n/r]个密文组才能还原
- 具有流密码方法的特征
-
优点:能进行可变长度的加密操作、具有实时性、可以部分解密数据
-
缺点:密文分组的错误传播、并不适用于并行处理的场景、需要保证初始向量的唯一性和完整性
-
应用:适用于流加密和对特定部分数据进行随机访问的场景
输出反馈模式OFB:
-
定义:结构类似CFB,但是反馈的内容是DES的输出而不是密文;其实说白了就是类似大一点的流密码,对着IV不断加密,加密一次就相当于获取了一个子密钥
-
与CFB的区别:
-
特点:
- 相同明文:改变IV同样会导致加密结果不同
- 链接依赖性:密钥流独立于明文
- 错误传播:有一个或多个比特错误的任意密文字符仅仅会影响该字符的解密
- 错误恢复:OFB模式能从密文比特错误中得以恢复,但在丢失密文比特后就无法实现自同步了,因为会破坏密钥流的编排
-
优点:能进行可变长度的加密操作、具有实时性、对密文分组的错误不敏感
-
缺点:传输错误不可恢复
-
应用:适用于实时数据流加密和随机访问的场景
计数器模式CRT:
-
定义:可以看做是OFB模式的简化版本
-
优点:
- 效率高
- 加密数据块的随机访问
- 可证明安全
- 简单
- 不受错误传播影响
-
缺点:计数器必须唯一、密钥流和明文相关性较弱
-
应用:适用于并行加密、随机访问和实时加密的场景
5.DES加密算法
5.1 原理
DES是属于对称密码算法中的分组加密算法(块加密)
- 分组长度为64bits
- 密文分组长度也为64bits
- 密钥长64位,其中56位参与运算,其余8位为校验位不参与运算(8,16,24,32,40,48,56,64)
- 算法主要包括:初始置换IP、16轮迭代的乘积变换、逆初始置换IP-1以及16个子密钥产生器。
- 采用Feiste密码结构
5.2 加密过程
- 先进行IP置换
- 再进行16轮的迭代运算
- 最后进行IP的逆置换
5.3 IP和IP-1置换
按照一定的规则,将原来的64位二进制数进行重新排序。
值不变换,位置变换
表的含义:例如 Initial 的第一个数是58,这表示将原始数据中的第58位,放到现在的第01位
5.4 16轮迭代
- 将64bit分成各32bit的L0和R0
- R0与K1进行一个轮函数的运算(参与运算的K都是48bit的)
- 轮函数输出的结果和L0进行异或,得到R1
- L1=R0
5.5 轮函数
-
设输入为 (x,y),则轮函数的输出为
-
轮函数是一个对合变换:进行两次变换后,会得到初始值
-
无论 f 函数如何选取,DES的轮函数都是一个对合变换
- R0先要进行一个E扩展(R0是32bit,K1是48bit,将R0扩展为48bit)
- R0和K1进行异或(XOR)
- 进行S盒的压缩(48bit->32bit)
将48位输入等分位8块,每块从6位输入压缩为4位输出
根据下图步骤算出行数列数,去查8个s盒的表,找到压缩结果,再将压缩结果转换为二进制
- 进行P盒置换(32bit->32bit)
和IP置换相同。
5.6 密钥生成
- 密钥为64位,通过PC-1表的置换,除去8位校验位,剩余56位
- 按照交换规则,生成16个48位的轮密钥
- 按此表进行循环左移:C/D1是由C/D0左移1位得到,C/D3是由C/D2左移2位得到
- 将Ci、Di拼接到一起,再通过PC-2进行置换,得到Ki
5.7 安全性分析
存在弱密钥
密钥太短,可以穷搜索密钥空间来破解DES加密——解决方法:多重DES
7.AES
【【AES加密算法】| AES加密过程详解| 对称加密| Rijndael-128| 密码学| 信息安全】
AES是为了取代被证明不安全的DES的
所以AES也是属于分组加密算法,明文固定长度为128位,密钥长度可以是128/192/256位。
密钥长度为128位时,循环10轮;192循环12轮;256循环14轮
AES采用SP结构,轮函数由3个不同的可逆均匀变换构成,称为3个层:
- 线性混合层:确保多轮之后的高度扩散
- 非线性层:将具有最优的“最坏情况非线性特性”的S盒并行使用
- 密钥加层:单轮子密钥简单的异或到中间状态上,实现一次性掩盖
算法中间结果称之为状态,状态可以用以字节为元素的矩阵阵列表示,该矩阵阵列有4行,列数Nb为分组长度除以32
种子密钥也用矩阵阵列表示,阵列有4行,列数Nk为密钥长度除以32
后面的讲述都以,明文密钥都为128bit(16字节)为例:
在AES中,数据将以4*4的矩阵来表示(16字节),不管是明文,密钥还是密文
加密过程
最终轮和循环运算的区别就是,最终轮没有列混合
初始变换
明文矩阵和子密钥矩阵,按字节进行异或得到初始变换的结果
字节代换
通过查表进行映射:例如19要被替换为 s-box 表中 x=1,y=9 的 d4
行移位
- 第一行保持不变
- 第二行向左移动1个字节
- 第三行向左移动2个字节
- 第四行向左移动3个字节
列混合
将输入的4*4矩阵左乘一个固定的矩阵(该矩阵是给定的)
这里的左乘有一些不一样,其实是域上的左乘, 因此需要把加法改成xor。例如第一行x第一列:S0,1=(2xp1) xor (3xp2) xor (1xp3) xor (1xp4)
继续深挖,2 x p1该怎样计算:先将 2*p1 看作 00000010 x a7a6a5a4a3a2a1a0
分两种情况:①a~7~=0时:2*p1 = a~6~a~5~a~4~a~3~a~2~a~1~a~0~0,即p1左移一位并在末尾补0
②a~7~=1时:2*p1 = a~6~a~5~a~4~a~3~a~2~a~1~a~0~0 xor 00011011,即p1左移后与(00011011)异或
3 x p2可以理解为:(2 x p2) xor p2 (因为3=00000011,可以理解为00000010+00000001)
轮密钥加
输入矩阵和一个轮密钥矩阵进行异或。每一列每一列,逐字节的异或。
生成轮密钥矩阵
利用一开始16字节,4*4矩阵的密钥进行扩展。密钥扩展是一列一列扩展的,那么不妨假设我们要求的列为 Wi:
- 如果 i 不是4的倍数,那么第 i 列由如下等式确定:W[i] = W[i-4] xor W[i-1]
- 如果 i 是4的倍数,那么第 i 列由如下等式确定:W[i] = W[i-4] xor T(W[i-1])
T函数:
函数T由3部分组成:字循环、字节代换和轮常量异或
a.字循环: 将1个字中的4个字节循环左移1个字节。即将输入字[b0,b1,b2,b3]变换成[b1,b2,b3,b0](竖着看就是向上移动1个字节)
b.字节代换: 对字循环的结果使用S盒进行字节代换
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中 j 表示轮数。Rcon[j]见下表
8.SM4
【【SM4加密算法】| SMS4 | 对称加密| 分组加密| 国密| 密码学| 信息安全|】
概况:
- 分组长度和密钥长度均为128bit
- 加密和密钥拓展都采用32轮非线性迭代结构
- 解密算法和加密算法结构相同,只是轮密钥的使用顺序相反
须知:
- 长度为32bits的组称为一个字(word)
加密过程:
- 输入和输出都是4个字:
- 由32次迭代运算和1次反序列变换R组成
例如:X4 = F(X0, X1, X2, X3, rk0) - 其中轮函数F:
- 其中合成置换T:由非线性变换 τ 和线性变换 L 复合而成。即T(.) = L(τ(.))
- 其中非线性变换 τ:由4个并行的S盒构成
- 其中线性变换 L:
解密过程:
-
解密变换和加密变换结构相同,不同的仅是轮密钥的使用顺序:
-
要证明SM4解密的合理性,只需要证明 Y4=X31
密钥生成:
- 密钥和轮密钥也用字表示:
- 系统参数FK:
- 固定参数CK:
- 目标:得到rk0rk31~ 这32轮轮密钥
- 轮密钥生成方法:
- 其中系统参数FK和固定参数CK是已知的常数:
- 其中T'与T相似,只是其中的L()有所改变。τ()运算没有改变
四、公钥加密
ECC加密算法
【【ECC加密算法】| ECC加密原理详解| 椭圆曲线加密| 密码学| 信息安全】
椭圆曲线
基于的数学难解问题:椭圆曲线离散对数问题
- Q = kP ,P为基点,k为私钥,q为公钥
- 给定k和P,根据加法法则,计算Q很容易
- 但给定P和Q,求k非常困难(实际应用中,质数p取得非常大,因此穷举出k非常困难)
椭圆曲线E: y2=x3+ax+b
kP的运算规则: 过A点做一条椭圆曲线的切线,会与椭圆曲线交于另一点2A',过2A'作平行于y轴的线,会与椭圆曲线交于另一点,此点为2A
3A:过A和2A作一条直线,会与椭圆曲线交于另一点3A',过3A'作平行于y轴的线,会与椭圆曲线交于另一点,此点为3A
域
但是椭圆曲线是有限的,不方便进行加密。我们想要的是离散的点。将椭圆曲线定义在有限域上就能把椭圆曲线变成离散的点了。
域: 是一个可以在其上进行加法、减法、乘法、除法运算,并且结果不会超出域的集合。如:有理数集合、实数集合都是域。但整数集合不是(相除会得到分数)
有限域: 如果域F只包含有限个元素,则称其为有限域。有限域中元素的个数称为有限域的阶。
每个有限域的阶必为素数的幂,即有限域的阶可表示为pn(p是素数,n是正整数)。有限域通常称为Galois域(伽罗瓦域),记为GF(pn)
在域的定义基础上,作如下修改:
- 定义模p加法和模p乘法(加或乘的结果超过p时,模p取余数;p为素数)
- 集合内的元素经过加法和乘法计算,结果仍然在集合内
- 计算符合交换律、结合率、分配率
- 加法和乘法有单位元素(所有集合内的数都有对应的负数,非零数都有倒数)
有限域上的椭圆曲线运算
E:y2=x3+ax+b (mod 23),基点:A(0,1)
计算P+Q的规则如下图:
计算过程中可能涉及负数求模/分数求模:
- 负数求模:x mod y = x-y * [x/y],x为负数
[x/y]表示x/y向下取整 - 分数求模:x/y mod p => n ≡ x/y mod p => y*n ≡ x mod p => yn mod p = x => n=?
当k过大的时候,可以将k转换为二进制,求对应次幂再相加(同RSA快速幂运算化简)
加密过程
- 选一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P
- 选定一个大数k作为私钥,并生成公钥Q=kP
- 加密:选择随机数r,将消息M生成密文C。密文是一个点对,即C=(rP, M+rQ)
- 解密:M+rQ-k(rP) = M+r(kP)-k(rP) = M (M+rQ 减去自己的私钥k和rP相乘,即可得到消息M)
RSA
上学期信安数学基础内容
困难问题: 大素数难分解问题
密钥生成:
加解密算法:
ElGamal
上学期信安数学基础内容
困难问题: 循环群中离散对数问题
工作原理:
ElGamal与RSA的区别:
- 数学困难问题
- 公开参数设置
五、Hash函数
1.Hash函数的基本概念
Hash函数的定义: 将任意长的消息M映射为较短的固定长度的一个值H(M),又称散列函数,压缩函数,杂凑函数,指纹函数等,其值为哈希值,散列值,杂凑码,指纹,消息摘要等。
- 是一个多对一的映射,即一个hash值对应多个原消息M
- Hash函数的H一般是公开的
- Hash函数的目的是为需认证的数据产生一个“指纹”
哈希函数应该满足的条件:
- Hash函数的输入可以是任意长
- Hash函数的输出是固定长
- 易于在软件和硬件中实现
Hash函数需要满足的安全条件:
- 单向性:即已知x,求H(x)较为容易;但是已知H(x),求x在计算上是不可行的
- 抗弱碰撞性:已知x,找出y(y≠x),使得H(y)=H(x)在计算上是不可行的
- 抗强碰撞性:找任意x,y,使得H(y)=H(x)也是不可行的
2.HMAC
【【HMAC | MAC | 基于哈希函数的消息认证码| 消息认证码 |HMAC-MD5| 信息安全】】
MAC的定义: 消息认证码 (Messeage Authentication Code) 是一种确认完整性并进行认证的技术。
消息认证码是一种与密钥相关联的单向散列函数
HMAC (Hash-based Message Authentication Code): 结合散列函数和密钥,使用密钥对消息进行哈希运算,生成固定长度的哈希值。
注意:HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC
HMAC计算步骤:
-
-
密钥预处理:
示例:HMAC-MD5
-
-
-
-
-
-
-
3.sha-1
【【SHA1算法】| 哈希算法 | Hash算法 | 密码学 | 信息安全| 消息摘要】
简介:
- 输入:0<L<264
- 输出:160bit的消息摘要
运算过程:
- 补齐:补齐 L mod 512 = 448
- 分组: 每组为512bit
- 运算: 对每个512bit的组进行运算。受到前一组计算出来的160bit摘要的影响
-
分组补位:
- 512- 64 = 448。这64位存储的是原始数据M的长度
-
- 例如:原始数据长为24bit。第一位补'1'。补0的个数为:423=448-(24+1)。最后64位存储的为M的长度 (00011000=24)
对分组进行运算:
-
扩充: 512=16*32bit。将16组的32bit扩充为80组的32bit
扩充公式: 前16组不变。Wt = ( Wt-3 ⊕ Wt-8 ⊕ Wt-14 ⊕ Wt-16) << 1,16≤t≤79
-
a,b,c,d,e 为初始链接变量。链接变量是用于存放运算过程中使用的变量
-
总共分为4轮运算。每轮包含20个步骤 (4*20=80)
注意:这里的加法是 mod 232 的加法
-
其中 T 详解如下:ROTL5(a) = a左移五位。ft如下图。Kt为给定常量。Wt为扩展出来的80组明文
-
将a,b,c,d,e(此时已经过80轮运算)与初始的连接变量相加,得到最终的结果。
注意:这里的加法是 mod 232 的加法
-
进行下一次512bit的运算。初始缓冲区a,b,c,d,e变为上一轮得到的H0(i),H1(i)...
4.SM3
【【SM3加密算法】|密码杂凑算法 | Hash算法 | 密码学 | 信息安全| 消息摘要】
概述:
- 输入:长度为 L ( L<264)的消息 m
- 输出:长度为256bit的杂凑值
基础符号:
步骤:
- 填充:同sha-1
- 分块:512bit为一组
- 迭代运算
填充: 第一位补'1',补零至 L mod 512 = 448,最后64bit存消息长度
分组: 512bits一组
迭代:
-
总体: n轮压缩函数的迭代。每轮生成256bit的杂凑值
V(i+1) = CF ( V(i), B(i) )。其中 CF 是压缩函数。V(0)为256bits的初始值IV,B(i)为填充后的消息分组,迭代压缩结果为V(n)
初始值IV:
-
消息扩展: 将消息分组B(i)扩展为132个字 (16->132)
-
其中P**1** ()函数:X的运算
-
压缩函数CF():
-
其中T**j**为一个常量:
-
其中,布尔函数FF**j** ()和GG**j** ():
六、数字签名
1.概要
定义: 用于对数字消息签名,以防消息的伪造或篡改。也可用于通信双方的身份鉴别。
数字签名应具有的特性:
- 签名是可信的:任何人可验证签名的有效性。
- 签名是不可伪造的:除合法签名者外,其他人伪造签名是困难的。
- 签名是不可复制的:一消息的签名不能复制为另一消息的签名。
- 签名的消息是不可改变的:经签名的消息不能被篡改。
- 签名是不可抵赖的:签名者事后不能否认自己的签名。
数字签名:对身份认证,保持数据完整性、不可否认性。
一个数字签名方案包含以下3个算法:
- 密钥生成:产生用户的公私钥
- 签名算法:产生消息的签名
- 验证算法:验证消息的签名是否合法
算法的安全性: 从m和s难求密钥x,或伪造消息m′,使 m′和s可被验证为真。
2.RSA数字签名算法
2.1 密钥生成
- 选两个保密的大素数p和q,计算n=p×q,φ(n)=(p-1)x(q-1)
- 选一整数e,满足1<e<φ(n),且 gcd(φ(n),e)=1
- 计算d,满足 ed ≡ 1 mod φ(n)
- 以{e,n}为公开钥, {d,p,q}为秘密钥
2.2 签名算法
设消息为m ∈ Zn,对其签名为:
s ≡ md mod n
2.3 验证算法
2.4 缺点
缺点:
-
对任意s ∈ Zn,任何人可计算 s'≡se mod n 作为消息m,因此任何人可伪造对随机消息 s 的签名。
s = md = sed mod n = s
-
如果消息m1和m2的签名分别为s1和s2,则知道m1 , s1, m2, s2的人可伪造对消息 (m1, m2) 的签名(s1, s2)。
s1 = m1d, s2 = m2d ; s1xs2 = ( m1xm2 )d
-
在RSA签名方案中,需签名的消息x ∈ Zn,所以每次只能对 [ log2n ] 位长的消息进行签名。签名速度慢。
解决方法: 签名之前先求消息的Hash值。
3.ElGamal签名算法
3.1 密钥生成
- p 和 q 是大素数,且 q | p-1
- 随机选取 q 阶元 g,1< g < p-1。q, p 和 g 公开
- 随机选取整数 x,1≤ x ≤ q-1,计算 y = gx mod p
- 公钥为 y,私钥为 x
3.2 签名算法
3.3 验证算法
七、密钥分享
1.Diffie-Hellman 密钥交换算法
【Diffie-Hellman密钥交换算法| 公钥加密| DH算法| 密码学| 信息安全】
DH算法基于离散对数问题
为什么要有密钥交换算法:
- 公钥加密算法无需对密钥的分发进行管理,方便了密钥管理
- 公钥加密算法加解密复杂,花费时间久
- 因此在实际运用中,加密机数据时,使用对称密码算法,密钥管理则使用公钥密码技术
原理:
中间人攻击:
2.Shamir门限
构造思路: 平面上用 k 个点确定唯一的 k-1 次函数。函数唯一,则f(0)也唯一。f(0)即为秘密s
秘密的恢复: 拉格朗日插值公式,根据点来确定函数
例如:
3.一次性口令
可以对抗重放攻击
不确定口令的方法:
-
口令序列
-
挑战/回答
-
时间戳
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)