PyCryptodome是一个低级密码学原语的独立Python包,它支持Python2.6、Python2.7以及Python3.4或更新的版本,另外还包括PyPy。
安装PyCryptodome
可以使用如下命令进行在线安装:
pip install pycryptodome
运行如下命令查看版本号:
python3 -c "import Crypto;print(Crypto.__version__)"
# 3.10.1
对称加密「AES标准」
我们可以使用PyCryptodome实现AES标准的对称加密与解密:
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
text = '你好吗?'
# 加密
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_EAX)
ciphertext = cipher.encrypt(text.encode())
with open('encrypted.bin', 'wb') as f:
f.write(cipher.nonce)
f.write(ciphertext)
# 解密
with open('encrypted.bin', 'rb') as f:
nonce = f.read(16)
ciphertext = f.read()
cipher = AES.new(key, AES.MODE_EAX, nonce)
text = cipher.decrypt(ciphertext).decode()
print(text)
在加密时,先用get_random_bytes
函数生成16个字节「128位」的随机密钥;然后实例化EAX模式的AES加密模型AES.new
并对文本进行加密cipher.encrypt
;在加密完成后将模型cipher
的随机数与密文一并保存或传送;
在解密时,先读取随机参数nonce
与密文ciphertext
;然后实例化EAX模式的AES加密模型AES.new
并对文本进行解密cipher.decrypt
,在解密后的明文通过decode
就能转换成可读的文本形式。
公钥加密的密钥生成「RSA算法」
使用PyCryptodome的公钥加密模块可以快速实现私钥与公钥的生成:
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
private_key = key.export_key()
with open('private.pem', 'wb') as f:
f.write(private_key)
public_key = key.publickey().export_key()
with open('receiver.pem', 'wb') as f:
f.write(public_key)
使用RSA.generate
方法生成RSA密钥;运行key.export_key
方法导出私钥;运行key.publickey().export_key
方法导出公钥。
公钥加密的加密与解密「RSA算法」
使用公钥加密方法传送用于对称加密的密钥:
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import PKCS1_OAEP
session_key = get_random_bytes(16)
print(session_key)
# 公钥加密
with open('receiver.pem', 'rb') as f:
recipient_key = RSA.import_key(f.read())
cipher_rsa = PKCS1_OAEP.new(recipient_key)
enc_session_key = cipher_rsa.encrypt(session_key)
# 私钥解密
with open('private.pem', 'rb') as f:
private_key = RSA.import_key(f.read())
cipher_rsa = PKCS1_OAEP.new(private_key)
dec_session_key = cipher_rsa.decrypt(enc_session_key)
print(dec_session_key)
在加密时,使用公钥recipient_key
作为参数创建RSA算法模型cipher_rsa
;并使用cipher_rsa.encrypt
方法进行加密;
在解密时,使用私钥private_key
作为参数创建RSA算法模型cipher_rsa
;并使用cipher_rsa.decrypt
方法进行解密。