分组密码的概念
又称为分块密码和块密码
1、将明文分成多个等长的块(block)
2、使用确定的算法和密钥对每组分别加密解密
AES 的块(block)的大小 是128位 16个字节
它的算法要求只能处理这么大的数据,多一个少一个 都不行
使用同样的算法加密,使用同样的方法解密
流密码
与之对应的是流密码
1、加密解密可以接受不定长的明文输入
2、古典密码就是典型的流密码
凯撒密码
![](https://img.haomeiwen.com/i1510669/1267a12deb1377a2.png)
分组密码需要解决的问题
1、如何使用不定长度的密钥
2、如何处理不定长输入报文
3、如何避免风险(重放、误差传播、完整性等)
AES 只支持3中密钥长度 128 、192、 256 对用户自编密钥有要求。
初始化向量
分组密码的工作模式 :设计一系列流程,关于密钥、随机量、明文、密文的操作顺序等问题的抽象泛华解决方案。
六种常见模式
初始化向量(Initialization Vector),是引入随机变量的一种措施,有些场景称为Nonce.
通常IV 无须保密
但不可重用
可以简单理解为 比较大的随机数
两个特点:1、不需要保密;2、不可用重用 ,不能使用同一个随机数,不能反复多次的使用它。
只有每次使用重新生成一个,不然会造成安全风险
填充方式
某些工作模式下需要输入进行填充补充
![](https://img.haomeiwen.com/i1510669/783a5e10c979146e.png)
![](https://img.haomeiwen.com/i1510669/6ae7ee7cf5c4f54d.png)
PKCS7 使用填充长度 比如填充长度为7 然后大家都是07
PKCS5 是 PKCS7 的子集,PKCS7 补齐的范围是1-255 PKCS5 补齐的数字是 1-7 它都是比较小的块的补齐
java 用的是 PKCS5Padding
参考:
https://blog.csdn.net/yanchenyu365/article/details/111429226
1、电子密码本(ECB)
最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。
加密
![](https://img.haomeiwen.com/i1510669/c77657579c329e56.png)
所有工作模式中最简单的一种
直接明文输入 加密 输出成密文
直接使用块加密算法 直接来进行
解密
![](https://img.haomeiwen.com/i1510669/36336395f29218c8.png)
密文输入,通过AES解密, 直接输出明文
其他模块到达之后依次类推 处理
块与块之间 没有顺序与关联度的
在于同样的明文块会被加密成相同的密文块;因此,它不能很好的隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议中。下面的例子显示了ECB在密文中显示明文的模式的程度:该图像的一个位图版本(左图)通过ECB模式可能会被加密成中图,而非ECB模式通常会将其加密成右图。
![](https://img.haomeiwen.com/i1510669/d147f2e7b493cd62.png)
伪代码表示
y=Enc(x,key)
x=Dec(y,key)
Enc 输入量为 明文 得到 密文
Dec 输入量为密文,得到明文
1、不能隐藏,比如加密头像,会发现明显的特征
2、缺少完整性保护
3、在密文中能出现 类似于明文中出现的类似的杰作
4、能重放的安全风险
ECB 模式的优点是可并行运算、速度快和易于标准化。
缺点是分组加密不能隐藏数据格式;不能抵抗组的重放、嵌入、删除等攻击;加密长度只能是分组的倍数。因此 ECB 模式仅适用于短数据加密,如果需要安全地传递 DES 密钥,ECB 是最合适的模式。
2、块连接CBC模式
1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。
加密
![](https://img.haomeiwen.com/i1510669/ea922992a471f0d3.png)
解密
![](https://img.haomeiwen.com/i1510669/2f945c902d60bcba.png)
y=Enc(last_y^x,key)
x=Dec(y,key)^last_y
CBC是最为常用的工作模式。它的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。解决后一个问题的一种方法是利用密文窃取。
注意在加密时,明文中的微小改变会导致其后的全部密文块发生改变,而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。
加密操作:CBC的处理结果依赖上一次的处理结果,导致无法利用现在多核的优势
解密操作:解密操作可以进行多核计算
如果某一块在传输过程中出现误差,就会影响到下一个模块的解密
3、密文反馈CFB模式
填充密码块链接(PCBC,Propagating cipher-block chaining)或称为明文密码块链接(Plaintext cipher-block chaining),是一种可以使密文中的微小更改在解密时导致明文大部分错误的模式,并在加密的时候也具有同样的特性。
加密
![](https://img.haomeiwen.com/i1510669/893a23bae9cfa0d0.png)
![](https://img.haomeiwen.com/i1510669/4c57f9bf15d37256.png)
前一个操作的密文,通过加密操作之后得到的结果,和当前的明文异或,得到当前的密文
特点:没有对明文加密,而是对IV 初始向量反复的加密 然后与明文异或。
解密
![](https://img.haomeiwen.com/i1510669/7673acd18cf692b8.png)
![](https://img.haomeiwen.com/i1510669/3383d99c7dd8fbeb.png)
上次明文输入加密算法中加密,然后加密结果和当前的密文进行异或得到当前的明文
本次的密文保留下来,跟下一次进行来做加密
第一次因为没有密文,所以用 Initialization Vector 加密, 得到加密密文后,反复加密,反复加密 一直在使用加密算法
伪代码
y=Enc(prev_y,key)^x
x=Enc(prev_y,key)^y
特点:加密的部分完全一样,区别是异或部分一个是x,一个是y
CFB 将块密码变成了流密码,因为使用了异或
![](https://img.haomeiwen.com/i1510669/d7553b0eda705773.png)
4、输出反馈OFB
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与明文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使明文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算,而在加密后进行校验也可以得出正确结果。
加密
![](https://img.haomeiwen.com/i1510669/4e27ead67471125c.png)
IV初始向量 加密 然后把结果给下一次加密
IV初始向量 加密 然后和明文异或,产生密文
OFB 和CFB的区别:OFB 是在块加密之后异或之前,CFB是在异或之后
解密
![](https://img.haomeiwen.com/i1510669/b4988d0c554c78bc.png)
和加密同样的流程,区别只是 明文和密文
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
伪代码
//加密
c=Enc(prev_c,key)
y=c^x
//解密
c=Dec(prev_c,key);
x=c^y
c会短暂的保持,留做下次使用
CFB保留的是y ,OFB 保留的是c
5、计数器CTR
注意:CTR模式(Counter mode,CM)也被称为ICM模式(Integer Counter Mode,整数计数模式)和SIC模式(Segmented Integer Counter)。
与OFB相似,CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。使用简单的、定义好的输入函数是有争议的:批评者认为它“有意的将密码系统暴露在已知的、系统的输入会造成不必要的风险”。目前,CTR已经被广泛的使用了,由输入函数造成的问题被认为是使用的块密码的缺陷,而非CTR模式本身的弱点。无论如何,有一些特别的攻击方法,例如基于使用简单计数器作为输入的硬件差错攻击。
CTR模式的特征类似于OFB,但它允许在解密时进行随机存取。由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上。
注意图中的“nonce”与其它图中的IV(初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。
加密
![](https://img.haomeiwen.com/i1510669/898bd9f218ddcf87.png)
动作都是上下文无关的,跟之前的链式的工作模式是不同的
解密
![](https://img.haomeiwen.com/i1510669/99a18ba3d749716b.png)
Nonce,每次只用一次,不能反复使用,每次加1 ,然后输入到加密模块进行加密,得到结果再和明文进行异或操作,得到密文。
步骤都一样,他们都是对随机量来进行加密
动作都一样 ,只需要关心计数器的变化
注意:都是加密,而且都是对随机量进行加密
这是一种 非常简单、非常清晰、效率非常高的一种模式
伪代码
Y=Enc(counter++,key)^X
X=Enc(counter++,key)^Y
加密:自增 输入到加密算法,然后和明文做异或
解密:自增,输入到加密算法,然后和密文做异或
e 两方必须是同步产生的且相等的,不然会乱。
这个e 的同步是基于大家使用相同的 IV 和Nonce来产生的
参考:
https://blog.csdn.net/shift_wwx/article/details/83750184
6、伽罗瓦计数GCM
ECB、CFB、OFB 三种模式可以解决 ECB 模式中相同明文生成相同密文的缺陷,CTR 又可以在此基础上提供多分组并行加密特性,但是它们都不能提供密文消息完整性校验功能,所有就有了 GCM 模式。
GMAC 全称是 Galois Message Authentication Code,中文名称为伽罗瓦消息验证码。
GMAC 就是利用伽罗华域(Galois Field,GF,有限域)乘法运算来计算消息的 MAC 值。
GCM 全称为 Galois/Counter Mode,可以看出 G 是指 GMAC,C 是指 CTR。它在 CTR 加密的基础上增加 GMAC 的特性,解决了 CTR 不能对加密消息进行完整性校验的问题。
GCM 加密所需数据:明文 P、加密密钥 Key、初始向量 IV、附加消息 F。
GCM 加密步骤如下:
将 P 分为 P1、P2、…、Pn,Px 长度 <= 128
生成累加计数器 c0、c1、c2、…、cn,由密钥 Key 计算出密钥 H
将 IV、c0 进行运算(连接、加和、异或等)得到 IV_c0,用 Key 加密 IV_c0 得到 IVC0
将 IV、c1 进行运算(连接、加和、异或等)得到 IV_c1,用 Key 加密 IV_c1 得到 IVC1,将 IVC1、P1 做异或运算得到 C1,用密钥 H 通过 GMAC 算法将附加消息 F 计算出 F1, F1 与 C1 做异或运算得到 FC1
将 IV、c2 进行运算(连接、加和、异或等)得到 IV_c2,用 Key 加密 IV_c2 得到 IVC2,将 IVC2、P2 做异或运算得到 C2,用密钥 H 通过 GMAC 算法将附加消息 FC1 计算出 F2, F2 与 C2 做异或运算得到 FC2
…
将 IV、cn 进行运算(连接、加和、异或等)得到 IV_cn,用 Key 加密 IV_cn 得到 IVCn,将 IVCn、Pn 做异或运算得到 Cn,用密钥 H 通过 GMAC 算法将附加消息 FC(n-1) 计算出 Fn, Fn 与 Cn 做异或运算得到 FCn
拼接 C1、…Cn 得到密文 C,用密钥 H 通过 GMAC 算法结合 FCn 和 IVC0 最终计算出 MAC
![](https://img.haomeiwen.com/i1510669/9761436306e75b67.png)
加密流程
特点
只有Data 需要保密,其他数据 Header Seq 可以公开
![](https://img.haomeiwen.com/i1510669/db6031031f4e7e31.png)
Addtl Auth Data 不需要保密的,额外的数据,它会受到算法完整性数据的保护
Seq 序号可以直接拿过来 当做IV来使用
Header Seq Data 这三个同时进入GCM模型中取计算
![](https://img.haomeiwen.com/i1510669/65734ea67c5e5aab.png)
认证标签及加密流程
Authentication Tag 对 Addtl Auth Data 进行保护
IV 依然遵守不可用重复使用的原则
解密流程
![](https://img.haomeiwen.com/i1510669/b4bfa5cdd0d77709.png)
![](https://img.haomeiwen.com/i1510669/ce7825ff785e8448.png)
AAD
IV
Ciphertext
ICV
这四个部分
直接解密 要么成功 要么失败
详细过程
https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/gcm-spec.pdf
![](https://img.haomeiwen.com/i1510669/0569dbf49d86a2ed.png)
红色部分是加密过程
![](https://img.haomeiwen.com/i1510669/bea407ea9d5e9786.png)
这里和 计数器CTR模式一样
![](https://img.haomeiwen.com/i1510669/3304ad44ef01926c.png)
![](https://img.haomeiwen.com/i1510669/3d5cefca34a23e1c.png)
![](https://img.haomeiwen.com/i1510669/f029730cdce0b6e5.png)
if len(IV)=96 直接使用 IV 的值
如果 IV 不够96
H 上一次计算的 空集合{} 和 IV 初始向量
计算完成之后就是128位的Y0
Yi=incr(Yi-1) for i=1,....,n
Pi 是明文
E 是加密算法
MSBu 是保留结果左边,左数多少位 剩下的不要
u 是最后的几位是 Pn
A 类数据A 密文数据C
Y0 用初始化计数器对Y0 进行加密
这个t 就是对大写T的替代的长度
![](https://img.haomeiwen.com/i1510669/d164be10a1d54613.png)
Ghash 输出是 128位数据
分段函数
![](https://img.haomeiwen.com/i1510669/51a59eb0a4bb31b9.png)
![](https://img.haomeiwen.com/i1510669/5ad950da39798290.png)
它是一个递归的,类似于斐波那契数列
![](https://img.haomeiwen.com/i1510669/4e77ccf50e1d49f5.png)
当前的 Xi= Xi-1 异或Ai 或者 Ci,然后乘以大写的H
这里的H 是有限域的乘法 而不是 实数的乘法
特点:
怎么利用CTR 计数器
怎么利用 认证标签的保护 数据完整性的校验
参考:AES算法(五)GCM工作模式
https://zhuanlan.zhihu.com/p/376692295
六种模式的比较总结
![](https://img.haomeiwen.com/i1510669/024f5a567b8d8f74.png)
百度支持的GCM
![](https://img.haomeiwen.com/i1510669/cda6f41e9109d2b7.png)
网友评论