published on in Python

密码篇・PyCryptodome示例「扩展」

返回教程主页

上篇 密码篇・并行密码猜解

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方法进行解密。

下篇 网络篇・操作环境准备