|
@@ -8,7 +8,7 @@ canonical={canonical}
|
|
* 比特序列的 `XOR`
|
|
* 比特序列的 `XOR`
|
|
** A XOR B :对A和B进行异或运算,得出的结果再和B进行异或运算。
|
|
** A XOR B :对A和B进行异或运算,得出的结果再和B进行异或运算。
|
|
** 两次运算会变回A `A^B^B=A`
|
|
** 两次运算会变回A `A^B^B=A`
|
|
-** image::images/crypto/XOR.png[XOR.png]
|
|
|
|
|
|
+** image::crypto/XOR.png[XOR.png]
|
|
|
|
|
|
== AES 算法简介
|
|
== AES 算法简介
|
|
|
|
|
|
@@ -16,25 +16,25 @@ Rijndael是由比利时密码学家设计的分组密码算法,于2000年被
|
|
|
|
|
|
=== AES 对称加密接收
|
|
=== AES 对称加密接收
|
|
|
|
|
|
-image::images/crypto/aes/AES.jpg[AES]
|
|
|
|
|
|
+image::crypto/aes/AES.jpg[AES]
|
|
|
|
|
|
AES 分组
|
|
AES 分组
|
|
|
|
|
|
-image::images/crypto/aes/AES-group.jpg.jpg[AES 密码分组]
|
|
|
|
|
|
+image::crypto/aes/AES-group.jpg.jpg[AES 密码分组]
|
|
|
|
|
|
=== 分组密码的填充
|
|
=== 分组密码的填充
|
|
|
|
|
|
- Pad1
|
|
- Pad1
|
|
|
|
|
|
-image::images/crypto/aes/AES.jpg[Pad1]
|
|
|
|
|
|
+image::crypto/aes/AES.jpg[Pad1]
|
|
|
|
|
|
- Pad1
|
|
- Pad1
|
|
|
|
|
|
-image::images/crypto/aes/Pad2PKCS5.jpg[Pad2PKCS5]
|
|
|
|
|
|
+image::crypto/aes/Pad2PKCS5.jpg[Pad2PKCS5]
|
|
|
|
|
|
=== 流密码
|
|
=== 流密码
|
|
|
|
|
|
-image::images/crypto/aes/StreamCrypto.jpg[流密码]
|
|
|
|
|
|
+image::crypto/aes/StreamCrypto.jpg[流密码]
|
|
|
|
|
|
=== AES 四种常见模式
|
|
=== AES 四种常见模式
|
|
|
|
|
|
@@ -42,36 +42,36 @@ image::images/crypto/aes/StreamCrypto.jpg[流密码]
|
|
|
|
|
|
==== ECB(电子密码本模式)
|
|
==== ECB(电子密码本模式)
|
|
|
|
|
|
-image::images/crypto/aes/ECB1.jpg[ECB]
|
|
|
|
|
|
+image::crypto/aes/ECB1.jpg[ECB]
|
|
|
|
|
|
===== 对ECB模式的攻击
|
|
===== 对ECB模式的攻击
|
|
|
|
|
|
攻击者无需破译密码就能操纵明文,典型案例如银行转账,付款人,收款人,金额,分为三个分组。攻击者只需要调换收付款人分组顺序即可实现反向转账。
|
|
攻击者无需破译密码就能操纵明文,典型案例如银行转账,付款人,收款人,金额,分为三个分组。攻击者只需要调换收付款人分组顺序即可实现反向转账。
|
|
|
|
|
|
-image::images/crypto/aes/ECB2.jpg[ECB]
|
|
|
|
|
|
+image::crypto/aes/ECB2.jpg[ECB]
|
|
|
|
|
|
==== CBC(密码分组链接,重点)footnote:[AES-CBC, https://blog.csdn.net/chengqiuming/article/details/82288851]
|
|
==== CBC(密码分组链接,重点)footnote:[AES-CBC, https://blog.csdn.net/chengqiuming/article/details/82288851]
|
|
|
|
|
|
-image::images/crypto/aes/CBC.jpg[CBC]
|
|
|
|
|
|
+image::crypto/aes/CBC.jpg[CBC]
|
|
|
|
|
|
-image::images/crypto/aes/CBC.png[CBC]
|
|
|
|
|
|
+image::crypto/aes/CBC.png[CBC]
|
|
|
|
|
|
===== ECB模式与CBC模式的区别
|
|
===== ECB模式与CBC模式的区别
|
|
|
|
|
|
* ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。因此即使明文分组1和明文分组2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
|
|
* ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。因此即使明文分组1和明文分组2的值是相等的,密文分组1和2的值也不一定是相等的。这样一来,ECB模式的缺陷在CBC模式中就不存在了。
|
|
* 在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
|
|
* 在CBC模式中,无法单独对一个中间的明文分组进行加密。例如,如果要生成密文分组3,则至少需要凑齐明文分组1、2、3才行。
|
|
|
|
|
|
-image::images/crypto/aes/CBC-ECB.png[CBC-ECB.png]
|
|
|
|
|
|
+image::crypto/aes/CBC-ECB.png[CBC-ECB.png]
|
|
|
|
|
|
===== 解密出错分析
|
|
===== 解密出错分析
|
|
|
|
|
|
** 假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响。
|
|
** 假设CBC模式加密的密文分组中有一个分组损坏了。在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只有2个分组受到数据损坏的影响。
|
|
|
|
|
|
-image::images/crypto/aes/CBC-badGroup.png[分组损坏]
|
|
|
|
|
|
+image::crypto/aes/CBC-badGroup.png[分组损坏]
|
|
|
|
|
|
** 假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密。见下图:
|
|
** 假设CBC模式的密文分组中有一些比特缺失了,那么此时即便只缺失1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密。见下图:
|
|
|
|
|
|
-image::images/crypto/aes/CBC-badLength.png[长度变化]
|
|
|
|
|
|
+image::crypto/aes/CBC-badLength.png[长度变化]
|
|
|
|
|
|
===== 对CBC模式的攻击
|
|
===== 对CBC模式的攻击
|
|
|
|
|
|
@@ -99,11 +99,11 @@ image::images/crypto/aes/CBC-badLength.png[长度变化]
|
|
|
|
|
|
==== CFB(密码反馈模式)
|
|
==== CFB(密码反馈模式)
|
|
|
|
|
|
-image::images/crypto/aes/CFB.jpg[CFB]
|
|
|
|
|
|
+image::crypto/aes/CFB.jpg[CFB]
|
|
|
|
|
|
CFB 并未真正通过密码学算法进行加密,即加解密其实是统一套 `XOR` 操作,安全性高度依赖 `IV` :
|
|
CFB 并未真正通过密码学算法进行加密,即加解密其实是统一套 `XOR` 操作,安全性高度依赖 `IV` :
|
|
|
|
|
|
-image::images/crypto/aes/CFB.png[CFB]
|
|
|
|
|
|
+image::crypto/aes/CFB.png[CFB]
|
|
|
|
|
|
===== ECB模式与CBC模式的区别
|
|
===== ECB模式与CBC模式的区别
|
|
|
|
|
|
@@ -111,7 +111,7 @@ image::images/crypto/aes/CFB.png[CFB]
|
|
|
|
|
|
明文分组和密文分组之间并没有经过“加密”这一步骤。在CFB模式中,明文分组和密文分组之间只有一个XOR
|
|
明文分组和密文分组之间并没有经过“加密”这一步骤。在CFB模式中,明文分组和密文分组之间只有一个XOR
|
|
|
|
|
|
-image::images/crypto/aes/CFB_CBC.jpg[CFB_CBC]
|
|
|
|
|
|
+image::crypto/aes/CFB_CBC.jpg[CFB_CBC]
|
|
|
|
|
|
===== 对CBC模式的攻击
|
|
===== 对CBC模式的攻击
|
|
|
|
|
|
@@ -119,7 +119,7 @@ Alice向Bob发送一条消息,这条消息由4个密文分组组成。主动
|
|
|
|
|
|
于是,Bob解密时,4个分组中只有第1个可以解密成正确的明文分组,第2个会出错,而第3个和第4个则变成了被攻击者替换的内容(也就是昨天发送的明文内容)。攻击者没有破解密码,就成功地将以前的电文混入了新电文中。而第2个分组出错到底是通信错误呢,还是被人攻击所造成的呢?Bob是无法做出判断的。
|
|
于是,Bob解密时,4个分组中只有第1个可以解密成正确的明文分组,第2个会出错,而第3个和第4个则变成了被攻击者替换的内容(也就是昨天发送的明文内容)。攻击者没有破解密码,就成功地将以前的电文混入了新电文中。而第2个分组出错到底是通信错误呢,还是被人攻击所造成的呢?Bob是无法做出判断的。
|
|
|
|
|
|
-image::images/crypto/aes/CFB_repeatAttack.jpg[CFB_repeatAttack]
|
|
|
|
|
|
+image::crypto/aes/CFB_repeatAttack.jpg[CFB_repeatAttack]
|
|
|
|
|
|
==== OFB(输出反馈模式)
|
|
==== OFB(输出反馈模式)
|
|
|
|
|
|
@@ -127,11 +127,11 @@ OFB模式的全称是output-Feedback模式(输出反馈模式)。在OFB模
|
|
|
|
|
|
OFB模式不是通过密码算法对明文直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。
|
|
OFB模式不是通过密码算法对明文直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。
|
|
|
|
|
|
-image::images/crypto/aes/OFB.jpg[OFB 一览]
|
|
|
|
|
|
+image::crypto/aes/OFB.jpg[OFB 一览]
|
|
|
|
|
|
-image::images/crypto/aes/OFB_crypt.png[OFB 加密]
|
|
|
|
|
|
+image::crypto/aes/OFB_crypt.png[OFB 加密]
|
|
|
|
|
|
-image::images/crypto/aes/OFB_decrypt.png[OFB 解密]
|
|
|
|
|
|
+image::crypto/aes/OFB_decrypt.png[OFB 解密]
|
|
|
|
|
|
==== CTR(计数器模式)
|
|
==== CTR(计数器模式)
|
|
|
|
|
|
@@ -141,14 +141,14 @@ CTR模式中,每个分组对应一个逐次累加的计数器,并通过对
|
|
|
|
|
|
===== 与OFB模式对比
|
|
===== 与OFB模式对比
|
|
|
|
|
|
-image::images/crypto/aes/CTR_crypt.png[OFB 加密]
|
|
|
|
|
|
+image::crypto/aes/CTR_crypt.png[OFB 加密]
|
|
|
|
|
|
-image::images/crypto/aes/CTR_decrypt.png[OFB 解密]
|
|
|
|
|
|
+image::crypto/aes/CTR_decrypt.png[OFB 解密]
|
|
|
|
|
|
* CTR模式和OFB模式都属于流密码。
|
|
* CTR模式和OFB模式都属于流密码。
|
|
* OFB模式是将加密的输出反馈到输入,而CTR模式则是将计数器的值用作输入。
|
|
* OFB模式是将加密的输出反馈到输入,而CTR模式则是将计数器的值用作输入。
|
|
|
|
|
|
-image::images/crypto/aes/CTR_OFB.png[CTR_OFB]
|
|
|
|
|
|
+image::crypto/aes/CTR_OFB.png[CTR_OFB]
|
|
|
|
|
|
==== GCM(Galois/Counter Mode)
|
|
==== GCM(Galois/Counter Mode)
|
|
|
|
|