密码算法设计与分析 - 课程笔记
基本概念
安全威胁
- 安全威胁
- 被动攻击
- 消息内容获取
- 业务流分析
- 主动攻击
- 中断(可用性)
- 篡改(完整性)
- 伪造(真实性)
- 人为威胁
- 被动攻击
被动攻击
被动攻击即窃听,是对系统的保密性进行攻击,如搭线窃听、非法拷贝等,以获取他人的信息。
被动攻击分类:
- 消息内容获取:直接对消息内容进行窃听,这样的通信系统通常没有对信息进行加密。
- 业务流分析:攻击者对截取的消息进行分析,虽然不能获得消息的具体内容,但可以确定消息的格式等信息。
被动攻击不对消息做任何修改,是难以检测的,因此抗击这种攻击的重点在于预防而非检测。
预防的方式:使用VPN(虚拟专用网络)、采用加密技术保护网络、使用加密保护的分布式网络等
主动攻击
主动攻击包括对数据流的篡改,或产生某些假的数据流等。
主动攻击分类:
- 中断(可用性) :使某些服务被暂停甚至主机死机,如DOS攻击
- 篡改(完整性) :对系统中传送的消息进行篡改,并使得消息进行正常的传输,不被发现。
- 伪造(真实性):伪造虚假的消息。
信息安全模型
安全业务
安全业务包括:保密业务、认证业务、完整性业务、不可否认业务、访问控制
- 保密业务
- 保护数据以防被动攻击。
- 保护方式可根据保护范围的大小分为若干级,其中最高级保护可在一定时间范围内保护两个用户之间传输的所有数据,低级保护包括对单个消息的保护或对一个消息中某个特定域的保护。
- 认证业务
- 用于保证通信的真实性。
- 在单向通信的情况下,认证业务的功能是使接收者相信消息确实是由它自己所声称的那个信源发出的。在双向通信的情况下,如计算机终端和主机的连接,在连接开始时,认证服务则使通信双方都相信对方是真实的(即的确是它所声称的实体)。
- 完整性业务
- 完整性业务应用于消息流、单个消息或一个消息的某一选定域。
- 用于消息流的完整性业务目的在于保证所接收的消息未经复制、插入、篡改、重排或重放,因而是和所发出的消息完全一样的。
- 不可否认业务
- 用于防止通信双方中的某一方对所传输消息的否认。
- 因此,一个消息发出后,接收者能够证明这一消息的确是由通信的另一方发出的。类似地,当一个消息被接收后,发出者能够证明这一消息的确已被通信的另一方接收了。
- 访问控制
- 访问控制的目标是防止对网络资源的非授权访问。
- 控制的实现方式是认证,即检查访问某一资源的用户是否具有访问权。
信息安全基本模型
安全的网络通信必须考虑以下4个方面:
- 加密算法
- 用于加密算法的秘密信息
- 秘密信息的分布和共享
- 使用加密算法和秘密信息以获得安全服务所需的协议
秘密信息的分布和共享:密钥分配和密钥管理技术等。
协议:让客户端及服务器确认彼此的身份的一类网络协议,握手协议等。
可信的第三方也被称作:密钥分配中心(KDC)
密码学基本概念
保密通信系统
由以下几部分组成:明文空间、密文空间、密钥空间、加密算法和解密算法。
密码系统主要包括以下几个基本要素:m, c, k1, k2, Ek1, Dk2
- 明文:发送方即将要发送的消息,m。
- 密文:明文经过密码变换后的消息,c。
- 密钥:能使密码算法按照指定的方式运行的一种特定的值,k(或公私钥k1, k2)
- 加密算法:对明文进行加密时所采用的一组规则,E。
- 解密算法:对密文进行解密时所采用的一组规则,D。
- 加密:由明文变换为密文的过程,c=Ek1(m)。
- 解密:由密文恢复出原明文的过程,m=Ek2(m)。
保密通信系统应满足的要求
- 保密通信系统在现有的计算能力下不可破译
- 系统的保密性不依赖于对算法的保密性,而依赖于密钥的保密性(Kerckhoff准则)
- 加密和解密算法适用于密钥空间的所有元素
- 系统便于实现和使用
密码体制分类
单钥密码(对称密码算法)
单钥密码算法所用的加密密钥和解密密钥相同,或实质上等同,即从一个易于得出另一个。
特征:单钥体制的加密密钥和解密密钥相同。
优势:加解密速度快,并且单钥加解密算法可通过资源受限的芯片来实现。
单钥密码对明文消息的加密有两种方式:
- 流密码:对明文消息按字符(如二元数字)逐位地进行加密,如Trivium、Grain算法等
- 分组密码:将明文消息分组(含有多个字符),逐组地进行加密,如DES,AES和SM4等
双钥密码(非对称密码算法)
加密密钥和解密密钥不相同,即从一个难于推出另一个。
特征:采用双钥体制的每个用户都有一对选定的密钥:一个是可以公开的,可以像电话号码一样进行注册公布,称为公钥;另一个则是秘密的,称为私钥。
将加密和解密能力分开。可以实现多个用户加密的消息只能由一个用户解读,可用于公共网络中实现保密通信;由一个用户加密的消息而使多个用户可以解读,可用于实现对用户的认证。
加密:公钥加密,私钥解密
认证:私钥加密,公钥解密
密码攻击分类
攻击类型 | 攻击者掌握的内容 |
---|---|
唯密文攻击 | 加密算法, 截获的部分密文 |
已知明文攻击 | 加密算法, 一个或多个明文密文对 |
选择明文攻击 | 加密算法, 自己选择的明文消息,及加密得到的相应密文 |
选择密文攻击 | 加密算法, 自己选择的密文消息,及相应的被解密的明文 |
密码学发展阶段
- 古典密码学:(例如凯撒密码、希尔密码、维吉尼亚密码、仿射密码等)
- 古代密码:艺术,斯巴达棒、藏头诗、剃头发等
- 近代密码:使用电动机械设备进行加解密,恩尼格玛机、洛伦兹密码机、紫色密码机等
- 第二阶段(1949-1975)(例如DES)
- 1949年Shannon发表的《保密系统的通信理论》(Communication Theory of Secrecy System),将信息论引入到密码学中,为密码学的发展奠定了理论基础。
- 第三阶段(1976-至今)(例如RSA、Diffie-Hellman密钥交换)
- 1976年Diffie和Hellman的“密码学的新方向”一文导致了密码学上的一场革命。他们首次提出:不仅加密算法可以公开,甚至加密使用的密钥也可以公开
古典密码
单表代换密码
例如 gcd(8,26)=2,8(m+13)+5 = 8m+5(mod 26),此时 m 和 m+13将被加密成为相同的密文,得到的密文将无法进行解密。
多表代换密码
现代密码学概况
现代密码学研究相关内容
NIST轻量级对称密码标准化工作
分组密码
分组密码算法简介
加解密原理
设计常用方法
香农(Shannon)提出的混淆和扩散原则为密码算法的设计提供理论基础。
混淆:密码算法应使得密钥、明文以及密文之间的依赖关系相当复杂,以至于这种关系对密码分析者来说是无法利用的。混淆功能通常由密码S盒、与、模加、模乘等非线性操作
实现 。
扩散:密码算法应使得明文的统计特性消失在密文中,密钥和明文的一位影响密文的许多位。扩散功能通常由置换、矩阵相乘等线性操作
来实现。
轮函数结构
分组密码算法的设计原则:先确定顶层结构,即使用的密码结构,分组长度,密钥长度,轮函数迭代的次数等,然后确定下层部件,即使用的密码部件、扩散部件等
箭头表示数据的流向。
Feistel结构
F函数是由密钥控制的置换,起到混淆的作用,交换起到了扩散的作用。
典型算法:DES
SPN结构
典型算法:AES
DES
- 发明
- 美国IBM公司
- 性质
- 一种用64位密钥来加密64位数据的方法
- 目标
- 提供高质量的数据保护
- 具有复杂性
- 在实现上可行、经济
- 现状
- 1977年被批准为美国联邦信息处理标准
- 1998年5月,美国EFF(Electronics Frontier Foundation)宣布设计了DES的专用解密机,用56小时破译了56比特密钥的DES。
- 1998年12月,美国决定不再使用DES算法。
整体结构
IP置换
IP逆置换
数据经过初始置换和逆初始置换,回到了原来的位置。其作用主要是将明文和密文按照字节放入密码芯片中
轮函数
拓展运算E盒
- 在下标为1的字符前插入上一个字符。即,下标为32的字符;
- 在下标为4的字符后插入下一个字符。即,下标为5的字符;
- 在下标为32的字符后插入下一个字符。即,下标为1的字符;
- 按照此规律扩展16bit。
压缩运算S盒
置换运算P
把指定的一位换成另外一位,无扩展和压缩,P置换的作用,使得每个S盒的输出影响下一轮6个不同的S盒
子密钥更新
PC-1的作用是得到有效的56比特密钥,PC-2置换是一个压缩置换,将C中的9,18,22,25位和D中的7,9,15,26位删去,其余位置换位置次序。
移位和置换的作用:每一轮使用不同的密钥位子集,但是16个子密钥中,每个密钥位大约被使用14次,增加了DES破译的难度。
双重DES
为了提高DES的安全性,并利用实现DES的现有软硬件,可将DES算法在多密钥下多重使用。
二重DES是多重使用DES时最简单的形式,二重DES所用密钥长度为112比特,强度极大地增加。
三重DES
使用两个密钥做三次加密,实现方式为“加密──解密──加密”,简记为EDE( Encrypt- Decrypt- Encrypt);
三个密钥的三重DES密钥长度为168比特,三个密钥的三重DES已在因特网的许多应用(如PGP和S/ MIME)中被采用。
广义Feistel结构密码算法
AES
- 起源
- DES的衰落: 20世纪末,当差分密码分析及线性密码分析现以后,由美国人开创的DES (Data Encr yption Standard,即数据加密标准)逐渐由繁荣走向衰落。
- 算法的征集:1997年4月15日,为代替即将退役的DES算法,美国国家标准技术研究所(NIST)特成立AES小组征集AES
- 候选算法:1998年8月12日,正式公布CAST-256、E2等15个候选算法,接受外界攻击和评论。
- 确定算法:2000年10月2日,比利时密码专家JoanDaemen和Vincent Rijmen提出的Rijindael(读为rain doll)算法,被美国商务部最终推荐为高级加密AES算法。
- 设计标准
- 抵抗所有已知的攻击
- 设计简单,典型的SPN结构
- 在各种平台上易于实现,速度快
整体结构
状态矩阵
AES算法的分组长度固定为128比特,以字节为基本单位转换为4×4的状态矩阵。矩阵中字节的排列顺序为从上到下、从左至右依次排列。
假设明文分组P为"abcdefghijklmnop",则对应状态矩阵如下
密钥矩阵
128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加(下面介绍);后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图所示:
上图中,设K = “abcdefghijklmnop”,则K0 = a, K15 = p, W[0] = K0 K1 K2 K3 = “abcd”。
密钥拓展
g函数由三部分组成:
- 字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
- 字节代换:对字循环的结果使用S盒进行字节代换。
- 轮常量异或:第一个字节同轮常量RC[j]进行异或,其中j表示轮数。
轮密钥加
简单的把当前状态 (state) 与扩展密钥进行按位异或
字节代换
字节变换(SubBytes)使用一个Sbox,将state中每一个字节替换为Sbox中的对应字节。Sbox是一个有256个元素的一维数组,直接查找当前字节所对应的新的字节并替换即可。
S盒
Sbox其非线性变换为:输入的列的每个元素用来指定Sbox的地址:前4位指定Sbox的行,后4位指定Sbox的列。行和列所确定Sbox位置的元素取代输入矩阵中相应位置的元素。
行移位
把每行循环左移,按照字节移位,第一行不变,第二行循环左移1位,第三行循环左移2位,第三行循环左移3位。
列混合
可以表示为矩阵相乘来实现 。
与DES对比
SM4
SM4算法是我国发布的商用密码算法中的分组密码算法。
- 于2006年公开发布,并于2012年3月发布为密码行业标准;
- 2016年8月转化为国家标准GB/T32907-2016《信息安全技术SM4分组密码算法》;
- 现在成为继2021年2月份SM9标识加密算法之后的又一项国密算法成为ISO/IEC国际标准。
作用:有效促进了ISO/IEC对称密码算法体系的完善,标志着我国商用密码科技水平和国际标准化能力的不断提升,进一步增强了我国商用密码产业国际竞争力。
整体流程
相关参数
加密密钥MK,SM4算法的加密密钥长度为128比特,将其分为四项,其中每一项都为为32位的字。表示为:
系统参数FK,其中每一项都为32位的字。表示为:
固定参数CK,用于密钥扩展算法。其中每一项都为32位的字。表示为:
轮密钥,其中每一项都为32位的字。轮密钥由加密密钥通过密钥扩展算法生成。表示为:
密钥扩展
将密钥的每个字分别与系统参数的每个字做异或运算得到(K0,K1,K2,K3),再将得到的后3个字与固定参数CK0做异或运算后进行函数T运算得到值C,最后将函数T运算得到的C与K0做异或运算就得到了第一轮的子密钥,也是下一轮密钥运算的K4。
第一步:密钥与系统参数的异或:
第二步:获取子密钥:
函数T
- 经过后3个字与固定参数异或后,得到的值A也为32位的字。
- 将A拆分为4个8bit的字节进行S盒变换。该S盒是一个固定的8比特输入8比特输出的置换。
- 将中间4个S盒的输出组成32位的值B。
- 将B与左移13位及左移23位的B进行异或处理作为函数T的输出C。
S盒
S盒变换与DES的类似,输入的8bit字节的前4位表示行,后4位表示列。
轮函数
与密钥扩展算法类似,将明文拆分后的4个字的后3个字与该轮的子密钥进行异或处理,之后再经过一个函数T(函数T与密钥扩展中的函数T相同,只是后面的L处理变为B与左移2位及左移10位及左移18位及左移24位的B进行异或处理)得到C,之后再将明文拆分后的第一个字与C进行异或。运行32轮。
可表示为:
反序变换
工作模式
包括ECB、CBC、CFB、OFB、CTR,具体内容参见另一个博文:CTF密码学基础知识整理
攻击方法
- 数学类攻击
- 差分密码攻击
- 线性密码攻击
- 侧信道类攻击
- 差分能量分析(DPA)
- 差分故障分析(DFA)
差分密码分析
- 时间
- 1991年
- 提出者
- 以色列学者Eli Biham和Adi Shamir
- 基本思想
- 通过分析
明文对的差值
对密文对的差值
的影响来恢复某些密钥比特
- 通过分析
2005年,王小云等使用差分攻击的思路,提出了对MD5差分的攻击方法
线性密码分析
- 时间
- 1993年
- 提出者
- 日本学者Mitsuru Matsui
- 基本思想
- 通过寻找一个给定密码算法的有效的
线性近似表达式
来破译密码系统
- 通过寻找一个给定密码算法的有效的
侧信道类攻击
侧信道攻击又称边信道攻击,核心思想是通过加密软件或硬件运行时产生的各种泄漏信息获取密文信息,如通过功耗、电磁辐射、时间等。
- 如果集成电路未采取保护措施,则可能只需要很小的代价就可以实现破解并获得密钥。
- 根据目前报道的文献资料,如未对侧信道攻击进行防御设计,许多算法都可在短期内(几分钟到数天)被破解。
- 侧信道分析攻击方式成为破解密码芯片的可能的一条“捷径”,越来越受到学术界和工业界的关注。
差分能量分析DPA(Differential Power Analysis)
- 时间
- 1998年
- 提出者
- Paul Kocher
- 基本思想
- 利用能量消耗的值来推测相关的秘密信息甚至是密钥
数据收集:收集密码设备使用同一个密钥和不同的输入时执行加密操作的能量迹,同时敌手还需要截获最终生成的密文
数据分析:使用统计分析和错误相关技巧推导与密钥相关的信息
差分故障分析DFA(Differential Fault Analysis)
- 时间
- 1996年
- 提出者
- Boneh、Demillo和Lipton
- 基本思想
- 在加密过程中引进故障,使加密算法中间状态改化,然后通过分析正确密钥和引进故障后发生的错误密钥流,能得出部分或完整的中间状态信息,进而恢复密钥
侧信道攻击实例
流密码
序列密码算法中,加密的过程比较简单,即密钥流按照比特与明文进行异或,这里的密钥流表示的是由主密钥经过一定的变换生成的序列。
LFSR
移位寄存器(Shift Register,SR)是指有若干个寄存器排成一行,每个寄存器中都存储着一个二进制数(0或1)。
F2上一个n级反馈移位寄存器
由n个二元存储器与一个反馈函数f(a1,a2,...,an)组成。
移位寄存器每次把最右端(末端)的数字输出,然后整体向右移动一位。经过反馈函数计算得到的反馈位填入最左端(首端)的寄存器中。
例如:
经过16步的计算,内部状态又变回0110的状态,与初始状态相同,下一步运算与前面的运算相同。一但内部状态出现重复,输出流也会出现重复,呈现出周期的特点。
非线性生成器
Geffe序列生成器
JK触发器
布尔函数
汉明重量
向量中非零分量的个数
判断平衡:n是参数个数,2^(n-1)=2,所以两个0两个1才是平衡的。
由真值表到代数正规型
计算小项表示,f()=0则系数为0,x上标是其取值,累加起来
哈希函数
完整性校验、数字签名
使用方式
加密提供了认证性,只有发方能产生加密的哈希码
1 全部加密
2 只对哈希值加密
3 哈希值私钥加密,即是签名
4 签名+全部对称加密
5 加盐
6 加盐加密
应满足的条件
- 函数的输入可以是任意长。
- 函数的输出是固定长。
- 已知x,求H(x)较为容易,可用硬件或软件实现。
- 已知h,求使得H(x)=h的x在计算上是不可行的,这一性质称为函数的单向性,称H(x)为单向哈希函数。
- 已知x,找出y(x)使得H(y)=H(x)在计算上是不可行的。如果单向哈希函数满足这一性质,则称其为弱单向哈希函数。
- 找出任意两个不同的输入x、y,使得H(y)=H(x)在计算上是不可行的。
MD5
输入任意长,输出128bit。4轮。分组长度512bit。
SHA1 长度 160bit
SHA256 长度 256bit
SM3 长度 256bit
公钥密码
基于三个困难问题:
- 大整数分解问题
- 离散对数问题
- 椭圆曲线上的离散对数问题
数字签名
应具有的性质:
- 能够验证签名产生者的身份,以及产生签名的日期和时间。
- 能用于证实被签消息的内容。
- 数字签名可由第三方验证,从而能够解决通信双方的争议。
应满足的要求:
- 签名的产生必须使用发方独有的一些信息以防伪造和否认。
- 签名的产生应较为容易。
- 签名的识别和验证应较为容易。
- 对已知的数字签名构造一新的消息或对已知的消息构造一假冒的数字签名在计算上都是不可行的。
密钥分配和管理
密钥分为:初始密钥、会话密钥、公钥、私钥
密钥分配方式:公开发布、公用目录表、公钥管理机构、公钥证书