赞
踩
#声明:本文创作内容含代码均为个人创作所得,允许学习、传阅,不得用于商业用途#
为什么会有很多加密模式存在?
在对称加密算法中,我们常用的AES和SM4是不是可以满足所有的应用需求的数据块加密呢?比如我们将大量数据存放到硬盘中,又比如通信两端传输大量数据的应用场景。答案是否定的,如果简单的使用AES去加密所有的信息,则比较容易被破解,因为相同的数据块加密后的结果是一样的。假设我们将数据分为多块,每一块的数据加密后同时又影响到另一块的数据加密,然后依次影响后面的数据加密,这样的加密方案才是更加安全的,于是诞生了多种加密模式。不同加密需求适用于不同的加密模式;
下面(一 ,二,三,四,五)为最常见的五种加解对称加解密模式,剩下的是不常用的模式
如下图所示,将信息分组,然后对每组信息使用key加密,其实就是无模式加密,图中P为明文,E为加密算法,C为密文;图来源国家密码局
1.1 应用场景:
在计算机终端之间,或多人公用一个计算机终端,所交换的二级制数据可能有重复或者共同使用的序列。
1.2 性质:
需要将加密数据进行分组,如果最后一组数据不够长,需要进行填充;
优点:可以单独对某一个分组消息进行加解密;
缺点:相同的分组信息,得到的加密密文是一样的,这种方式容易收到“字典攻击”。要注意组之间的码间干扰。
如下图所示,将数据进行分组,将明文与上一组密文异或后,再进行加密;第一组明文和初始向量IV异或;
即:Ci = EK(Pi ^ Ci-1)
2.1应用背景:
从其加密方式来看,即使我们知道密钥和初始值IV,也很难得破解其中一个组的明文,也就说,这种加密方式最好适用于一块快数据,比如我们的磁盘,或者固态硬盘;IV我们设置为其数据块的初始地址,计算机读取磁盘数据是基于数据块的,对于整个磁盘,我们可以使用多个加密密钥key。
2.2 性质:
优点:相比于ECB,上一级数据的加密会影响到下一级的数据,且是用来IV 和 key两个参数用于加密,这种加密方式更安全。
缺点:没法单独对某一个小的分组数据来加解密,如果数据长度很小,那这种方式不太适合
CFB模式如下图所示,CFB和CBC有点类似,对初始向量进行加密,然后上一级密文输出影响下一级的加密,区别是在于,上一级的密文不是直接影响,而是先做一个数据转换;
简述加密过程:
1. 设定一个初始值IV,二进制为r个比特,然后直接赋值给FB1;
2. 取FB1的前n个比特,做为加密的数据输入
3. 取加密后的数据的前 j 个比特与分组密文异或得到本组的密文 C1
4. 在密文C1前面拼接上 k-j 个 比特 1, 使其长度为 k bit;
5. 将步骤4中 k bit数据 拼接在FB1的后面
6. 将取步骤5数据的后 r 比特作为下一轮FB2的数据
7. 重复步骤2 ~ 6, 得到所有分组密文
3.1 应用背景
对应采用CBC来加密,使用相同的IV和key可以得到相同的密文,更加增加安全性,于是可以把IV增长,想要获得密文,得需要另外一个参数 n, 也就是取IV前多少bit来加密;加密系统每增加一个参数,其系统也就越复杂一级。
3.2 性质:
系统安全性增加了,因为多了几个参数,k,j,n,r;另外由于我们加密的是IV及其中间变量,对分组明文的位宽并没有定义,所以可以不必按照AES,SM4来划分分组明文的大小。
OFB与CBC比较类似,CBC的密文是通过加密 分组明文与上级密文的异或;而OFB的密文是 明文与加密中间值前 j 比特的异或;即我们通过对初始值IV反复加密,然后用分组明文Pi与 加密每组的输出的前 j 比特异或。如下图所示:
4.1 应用背景:
该模式算是CBC的一个简单的升级版,安全性简单提高了。
4.2 性质:
优点:可以通过 j 的大小来控制明文分组的数量,,缺点:安全性不够高,需要经常更换IV和key
算法说明:分组加密的明文是 明文与 计算器值T的加密结果 异或;也就是每组的T是在前一个T上加一个常数,作为加密算法的输入。
如果最后一组数据位宽d不匹配加密输出的结果,可以只取加密值的前d bit异或。
这里的Ti是一个计数器的值,也就是 Ti+1 = Ti + m,至于这里T1的取值是啥呢?没有明确规定,可以是地址,可以是TRNG的一个值,或随机设定的一个数;n一般取1,也可以协商,
5.1 应用背景:
在一些常用的磁盘,或者大量数据存储的场景使用比较多
5.2 性质:
优点:可以并行处理,吞吐量与并行度成正比;使用不同计数器,得到不同密文
缺点:我也不知道,我不是研究密码学的,大家得找找论文,看看其破解难度与其他算法的定量区别。
算法说明:初始值TW也叫teeak值,先经过加密后得到T1,然后每乘一次阿尔法a得到一个Ti;分组明文先与Ti异或,然后再经过加密,加密后结果与当前的Ti异或,结果为本组的密文。
如果最后一组明文为d bit数长度小于分组长度n,我们需要对最后一组和倒数第二组特殊处理,如下图,把倒数第二组得到的明文的最后 前d bit 最后最后一组的密文输出,n-d bit 拼接到最后一组明文的后面组成n bit,进过加密后,输出密文作为倒数第二组的最终密文输出。
从算法结构上来看,初始值TW不仅经过加密模块,同时又称上 阿尔法a,明文也经过加密模块,这里的乘法是基于伽罗化域的。相比于CTR来说,这里的安全性更高,因为CTR值是每次简单递增,而XTS是经过了有限域乘法计算的。
6.1 应用背景:
该算法最常用的就是磁盘扇区加密,USB接口,等特殊的加密环境,其中tweak值用扇区地址表示,只要使用相同的密钥和tweak就可以得到相同的明文;
6.2 性质:
优点:可并行处理,吞吐量与并行度成正比,不同tweak下,相同明文产生不同的密文,加密安全性增加;
缺点:由于加入了有限域乘法,每轮两个加密操作,使得计算更加复杂,硬件实现面积更大,相对情况下,工作频率更低。
算法说明:
1. 明文分组为P1 P2,... , Pq, 已知一个初始值TW
2. 先利用压缩函数Hk2得到Z1中间变量,Z1 = P1^Hkz( P2|P3|...Pq|TW)
3. 利用加密函数AES或者SM4加密Z1 得到Z2
4. 生成C2...Cq ;生成方法就是上面讲的计数器模式CTR,count 为1,2,...,q-1
5. 利用压缩函数生成明文C1,C1=Z2^Hkz(C2|C2...|Cq|TW)
其中压缩函数表达式为:
HK2(M1|M2|...Mm-1) = M1*K^(m+1) ^ M2*K^(m)... ^(Mm|zero(n-d))*K2 ^(m1|m2..Mm-1)*k
公式说明:
压缩过程为:Mi 乘 K的m+1次幂,一共有m个改乘法,如果Mm的位宽d小于分组位宽n,则尾部补0,最后一组乘法为m个Mi拼接乘K,最后这些乘法的结果异或得到了压缩值,这里的乘法是伽罗华域乘,异或为二进制域。
从图上来看,输出密文为,P2,P3..., Pq,P1与所有的输入有关,好像是一种hash,因为只要有输入改变,那P1一定会变,类似于GCM模式;是不是可以认为这种模式就是AES-GCM的国密版呢?
7.1 应用背景:与XTS一样,用于磁盘扇区加密等特殊加密环境
7.2 性质:
优点:支持并行加解密(除第一行外)
HCTR明文和密文长度一样,无论加解密,任意输入数据的变化,都会来带输出比特的变化,安全性高
缺点:计算度复杂,硬件实现面积要大很多
与之前的XTS比较类似,不做介绍了,加密过程可以直接冲图上看出
算法说明,将输入初始值IV经过加密,形成迭代的密钥Ki,然后每个Ki作为加密的K与明文加密,得到输出密文,过程比较简单,不做过多介绍;
从下图来看,GCM加密模式是在计数器模式上多增加了一个GHASH的功能,这样,通过对比TAG值来确定数据源是否被篡改;图上H值是用密钥对128bit 0加密所得;MultH为GF(2,128)的乘法,密文的获取和计数器模式一样,,每一级的tag值为 上一级tag * H 再异或上输出密文;最后一个级tag值为 迭代最后一级乘H,然后与A|C长度异或,再乘H,再与counter0加密值异或;
GCM最大的功能就是增加了Hash功能,防止信息被篡改。
我们将加密后的消息,与Auth tag一起 发送出去,接受者将数据解密后,同时计算Auth tag值,如果计算的值与消息中附加的值一致,我们可以认为消息是没被篡改的。
类似这种带MAC的,还有很多种模式,如果OCB-MAC,CCM-MAC,OMAC,PMAC,CMAC等等,有些已经形成了标准,有些还没有,大家根据实际需求,按照应用场景选择模式加密模式和MAC方式;
待我慢慢补充完善,算法说明,python脚本,verilog硬件实现
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。