实验三:AES
一、问题描述:
实现两个基于 AES 的加密/解密系统,一个在 CBC 模式下使用 AES,另一个在 CTR 模式下使用 AES。 在这两种情况下,16 字节的初始向量 IV 都是随机选择的,并已放在密文中。
测试密文略。
二、实验环境:
系统:Windows 10
IDE:pycharm
编译语言:python
三、程序代码与结果分析:
(1)CBC模式实现
首先是加密函数的部分,我们定义初始化向量,在这里固定了,在实际情况我们应该随机选择,但是实验就简单的固定了。我们首先将密文编码,然后用密码本模式创建一个aes对象,pad是一个匿名函数,作用就是将明文填充到16个字节的整数倍,如果明文恰好是16个字节,我们就再填充一个16字节,填充的内容是与16个字节的差值。
之后我们定义一个密文空间,是字节数组对象,将向量的值放到字节数组的前面,对于每一个明文块和密文快进行异或操作后,送入aes进行加密,加密的结果作为下一个密文块,以此类推,最后返回这个密文。以字节格式返回。
下面是解密函数的实现,首先,我们确定一下密文的类型,统一转到字节类型,然后去除密文前面的向量,初始化一个aes的密码本模式对象,我们将iv和密文分离,对于每一块,我们先解密,在和前一个密文块进行异或,得到的结果添加到明文空间,最后输出民文,这里我们将密文最后的填充部分给去除了。
(2)CTR模式实现
同CBC模式,首先我们定义加密函数,CTR主要和CBC模式不同的就是他有一个计数器,我们将计数器的加密结果异或上明文即是密文块,这样就得到了密文,返回计数值和明文块长度的密文块的和。
我们来看一下计数器是如何生成的,简单来说就是对于每一个明文块我们进行计数,当然要转化为字节类型然后返回即可。
接下来是解密函数的实现,因为加密和解密是对称的,所以我们只需要将密文块的计数器作为加密的iv传入即可
下面是main函数
- 运行结果
- 实验中遇到的问题以及实验体会:
这次实验是对AES的两种加密模式的实现,通过这次实验,我对这两种模式的工作机制也更加熟悉,对于加密过程也更加了解,也有助于我们学习块密码,以及类似加密算法。
这次实验比较简单,而且技术也十分成熟,所以做起来还是挺顺利的,基本上没有遇到问题,有小问题也很快就解决了。
相关资源:
https://download.youkuaiyun.com/download/dxxmsl/87699396?spm=1001.2014.3001.5503
https://www.xsblog.site/<== 我的博客