对称加密AES

加密思路:

​ 根据分组进行填充

 待加密的明文以16字节分组进行加密,如果数据字节长度不是16的倍数,最后的一组则需要在有效数据后面进行填充,使得数据长度变为16字节,AES填充方式分为NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。
  NoPadding:不填充,那就只能加密长度为16倍数的数据,一般不使用
  Zeros:补0,如果原数据长度恰好是16的倍数,也要补16个0
  ISO10126:最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数

加密方法:

加密方式分为五种:电码本模式(Electronic Codebook Book (ECB))、密码分组链接模式(Cipher Block Chaining (CBC))、计算器模式(Counter (CTR))、密码反馈模式(Cipher FeedBack (CFB))、输出反馈模式(Output FeedBack (OFB))。实际应用比较多的是ECB和CBC。

  1. ECB模式(Electronic Code Book Mode)
    ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

优点:有利于并行计算;误差不会累计(互不干扰)。

缺点:可能对明文进行主动攻击。

xqvDn1.png

ECB加密过程:

1
2
3
4
5
6
7
from Crypto.Cipher import AES   //aes库

plaintext = pad(flag, 16) //首先对明文分组填充
key = xxxxx //生成aes加密密钥

cipher = AES.new(key, AES.MODE_ECB) ecb模式加密
ciphertext = cipher.encrypt(flag)

ECB解密过程:

1
2
3
4
5
6
from Crypto.Cipher import AES

key = xxxxx //生产aes解密密钥

cipher = AES.new(key, AES.MODE_ECB) //ecb模式解密
flag = cipher.decrypt(ciphertext)
  1. CBC模式(Cipher Block Chaining Mode)
    CBC模式对于每个待加密的密码块,在加密前会先与前一个密码块的密文异或然后再用加密器加密(图中的圆圈十字符号表示异或操作,下同)。第一个明文块与一个叫初始化向量的数据块异或。加、解密双方共同知晓密钥和初始化向量才能实现加解密。

优点:安全性比ECB模式高;是SSL的标准。

缺点:数据块之间的加密有依赖关系,因此不能并行计算。

xqvctO.png

解密思路:若能知道iv,则解密类似于cbc,若iv已知,观察能否通过爆破或其他方式求出iv,若不能,考虑是否存在多次加密且得知某一次的iv 得到了相同的密文, 根据公式:iv2 = iv1 ^ c1 ^ c2 可推出iv2.

  1. CFB模式(Cipher Feedback Mode)
    CFB 模式是用分组算法实现流算法,明文数据不需要按分组大小对齐。

优点:明文数据不需要按分组大小对其,即无需填充。

缺点:同CBC模式,无法并行计算。

xqvr0x.png

  1. OFB模式(Output Feedback Mode)
    OFB 模式的过程和CBC模式有点像,但明文数据不需要按分组大小对齐。

优点:明文数据不需要按分组大小对其,即无需填充。

缺点:同CBC模式,无法并行计算。

xqv6AK.png

  1. CTR模式(Counter Mode)
    CTR模式是在ECB模式的基础上,引入了Nonce随机数和Counter计数器,Nounce随机数和Counter计数器整体可看作计数器,每加密一段明文,计数器向上加一,并且这个计数器都会和初始IV进行连接、加加、异或等运算,然后使用加密器进行加密,最后在和明文异或得到分段密文。

优点:明文数据不需要按分组大小对其,即无需填充。

缺点:加密方和解密方需要同时维护初始IV、Nonce、Counter。

xqvs76.png