点击上面 蓝字 关注,谢谢。
CBC模式
![52242db492b35d1510b844c6e7805a47.png](https://i-blog.csdnimg.cn/blog_migrate/a16301c2ee7e76509ef752ec93f5cdab.png)
大家好,这里是求道轩,我是求道仙人。 给我5分钟,带你看世界。
昨天AES的题目慢慢想还是可以理解,虽然遇到新题不一定会做,内部加密原理也不懂。
今天这个模式稍微难点了。
[来源]
集团信安新平台-Crypto训练专题
[工具]
python
[知识点]
AES
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法,对称加密算法也就是加密和解密用相同的密钥。
昨天了解了ECB模式,最简单的模式,每组相互独立。
今天看另一个模式,密码分组链接模式(Cipher Block Chaining (CBC))
相对于昨天的ECB模式,多了一个初始随机向量IV,长度128位,明文块先异或运算后再实验key加密,每组明文密码不独立,后一段明文与前一段密码异或后再加密。
简单说密文i不仅和明文i有关,还和密文i-1有关。随机向量IV相当于初始密文。
下来做几道题。
[解析]
AES00 EasyCrypt
简单入门题,核心代码如下
class aesdemo:
……
def encrypt(self, plaintext):
# 生成随机初始向量IV
iv = Random.new().read(16)
aes = AES.new(self.key,AES.MODE_CBC,iv)
prev_pt = iv
prev_ct = iv
ct=""
msg=self.pad(plaintext)
for block in self.split_by(msg, 16):
ct_block = self.xor(block, prev_pt)
ct_block = aes.encrypt(ct_block)
ct_block = self.xor(ct_block, prev_ct)
ct += ct_block
return b2a_hex(iv + ct)
# 测试模块
if __name__ == '__main__':
BS = AES.block_size # aes数据分组长度为128 bit
key="asdfghjkl1234567890qwertyuiopzxc"
demo = aesdemo(key)
e = demo.encrypt(flag)
print("加密:", e)
已知key,通过CBC模式自定义AES加密flag并输出
自定义加密函数随机生成向量IV,然后每个明文块mi先异或IV,再AES,在异或IV得到密文块ci
全部ci拼接起来前面加上IV返回转为16进制输出。
对于加密结果da1203c923a202adb4076abab6232e5288c65a65380dbe82d18c47b1613