题目
(1)使用cryptography模块,编写完整的AES-CBC加解密函数,函数接口为:
def encrypt_CBC(key, plaintext, iv)、def decrypt_CBC(key, ciphertext, iv);
(2)使用pycryptodome模块,编写程序,实现RSA-OAEP加解密;
知识补充
(1)AES是高级加密标准(Advanced Encryption Standard)的缩写,AES是最常见的对称加密算法。
对称加密算法也就是加密和解密用相同的密钥,同一个秘钥即用来加密,也用来解密。
关于加密解密的原理可以搜索一下相关的文章。
RSA是一种典型的非对称密钥密码体制,从加密密钥和解密密钥中的任何一个推导出另一个在计算上是不可行的。RSA的安全性建立在“大数分解和素性检测”这一著名数论难题的基础上。
公钥对可以完全公开,不需要进行保密,但必须提供完整性检测机制以保证不受篡改;
私钥由用户自己保存。通信双方无需实现交换密钥就可以进行保密通信。
(2)RSA密码体制算法如下:
由用户选择两个互异并且距离较远的大素数p和q;
计算n=p×q和f(n)=(p-1)×(q-1);
选择正整数e,使其与f(n)的最大公约数为1;
然后计算正整数d,使得e×d 对f(n)的余数为1,即e×d≡1 mod f(n),最后销毁p和q。
经过以上步骤,得出公钥对(n,e)和私钥对(n,d)。
设M为明文,C为对应的密文,
则加密变换为:C=M^e mod n;
解密变换为:M=C^d mod n。
安装使用
在python中,扩展库pycrypto、pycryptodome和cryptography提供了SHA系列算法和RIPEMD160等多个安全哈希算法,以及 DES、AES、RSA、DSA、ElGamal等多个加密算法和数字签名算法的实现。
crypto这个模块的安装比较特殊,可能会有点小坑,安装时需要注意!
crypto,pycrypto,pycryptodome这三个python中密码学相关模块的功能是一样的。
但是crypto与pycrypto已经没有维护了,所以推荐使用pycryptodome。
而且这几个模块的适用性不同,分Linux和Windows操作系统,还分Python2和Python3......
在 Windows 中,不管是 Python2 和 Python3 ,都不能用 crypto 和 pycrypto ,只能用 pycryptodome模块进行密码学编程。
在 Linux 中,不管是 Python2 和 Python3 ,都不能用 crypto ,只能用 pycrypto 和 pycryptodome 。
下面是windows系统下Python3的安装教程,安装之前,最好先把 crypto 和 pycrypto 卸载了,否则命令行会报好多红字的错误。
安装命令如下:
pip uninstall crypto
pip uninstall pycrypto
pip install pycryptodome
代码示例
#coding:utf-8
#author:Mitchell
#使用cryptography模块,编写完整的AES-CBC加解密函数,函数接口为:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
from Crypto.Random import get_random_bytes
def encrypt_CBC(key, plaintext, iv):
#实例化加密套件,使用CBC模式
cipher = AES.new(key, AES.MODE_CBC, iv)
#对内容进行加密,pad函数用于分组和填充
encrypted_data = cipher.encrypt(pad(plaintext, AES.block_size))
return encrypted_data
def decrypt_CBC(key, ciphertext, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
tmp = cipher.decrypt(ciphertext)
decrypted_data = unpad(tmp, AES.block_size)
return decrypted_data
data = b"I love sdu" #要加密的内容
print("原始明文=",data)
key = get_random_bytes(16) #随机生成16字节(即128位)的加密密钥
iv = get_random_bytes(16)
encrypted_data=encrypt_CBC(key,data,iv)
print("AES加密后的密文=",encrypted_data)
decrypted_data=decrypt_CBC(key,encrypted_data,iv)
print("AES解密后的明文=",decrypted_data)
#使用pycryptodome模块,编写程序,实现RSA-OAEP加解密;
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
#生成密钥
key = RSA.generate(1024)
#提取私钥
private_key = RSA.import_key(key.export_key())
print("私钥=",private_key)
#提取公钥
public_key = RSA.import_key(key.publickey().export_key())
print("公钥=",public_key)
data = b"I love sdu"
print("原始明文=",data)
#实例化加密套件
cipher = PKCS1_OAEP.new(public_key)
#加密
encrypted_data = cipher.encrypt(data)
print("RSA加密后的密文=",encrypted_data)
#实例化解密套件
cipher = PKCS1_OAEP.new(private_key)
#解密
decrypted_data = cipher.decrypt(encrypted_data)
print("RSA解密后的明文=",decrypted_data)
运行效果