images/blog-posts

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

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

SUBSCRIBE


🔒 No spam. Unsubscribe any time.

About kk

kk

Vincenzo Antedoro is an engineer who helps those who want to invest in renewables. For the rest he enjoys teaching with the method of learning by doing..

» More about kk