欢迎访问宙启技术站
智能推送

加密解密示例:演示如何使用cryptography.hazmat.primitives.ciphers加密解密文本

发布时间:2023-12-16 08:35:17

在 Python 中,使用 cryptography 模块中的 hazmat.primitives.ciphers 来进行加密和解密文本是一个常见的做法。下面是一个示例,展示如何使用该模块进行加密和解密文本。

首先,我们需要安装 cryptography 模块,可以通过以下命令来安装:

pip install cryptography

接下来,我们可以使用以下代码来加密和解密文本:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes

# 生成密钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 序列化密钥
private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
public_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 保存密钥到文件
with open('private_key.pem', 'wb') as f:
    f.write(private_pem)
with open('public_key.pem', 'wb') as f:
    f.write(public_pem)

# 读取密钥
with open('private_key.pem', 'rb') as f:
    private_pem = f.read()
    private_key = serialization.load_pem_private_key(
        private_pem,
        password=None,
        backend=default_backend()
    )
with open('public_key.pem', 'rb') as f:
    public_pem = f.read()
    public_key = serialization.load_pem_public_key(
        public_pem,
        backend=default_backend()
    )

# 加密函数
def encrypt_text(text, key):
    iv = b'\x00' * 16  # 初始化向量
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    encryptor = cipher.encryptor()
    padder = padding.PKCS7(128).padder()  # 填充器
    padded_data = padder.update(text.encode()) + padder.finalize()  # 填充
    encrypted_data = encryptor.update(padded_data) + encryptor.finalize()  # 加密
    return encrypted_data

# 解密函数
def decrypt_text(encrypted_data, key):
    iv = b'\x00' * 16
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    decryptor = cipher.decryptor()
    decrypted_padded_data = decryptor.update(encrypted_data) + decryptor.finalize()  # 解密
    unpadder = padding.PKCS7(128).unpadder()  # 反填充器
    unpadded_data = unpadder.update(decrypted_padded_data) + unpadder.finalize()  # 反填充
    return unpadded_data.decode()

# 加密示例
text = "Hello, World!"
encrypted_data = encrypt_text(text, public_key)
print("Encrypted data:", encrypted_data)

# 解密示例
decrypted_data = decrypt_text(encrypted_data, private_key)
print("Decrypted data:", decrypted_data)

在上面的示例中,我们首先使用 rsa 生成了一对公私钥,并将其保存到 private_key.pempublic_key.pem 文件中,这样我们可以在需要的时候从文件中读取密钥。

然后,我们定义了一个 encrypt_text 函数来进行文本加密,以及一个 decrypt_text 函数来进行文本解密。这两个函数使用了 AES 对称加密算法和 CBC 模式。

最后,我们演示了如何使用这些函数来加密和解密文本。

请注意,这个示例中使用的是对称加密算法 AES,并且密钥是使用 RSA 公私钥生成的。这只是一个示例,具体的加密解密方法和使用哪种加密算法取决于实际的需求和安全性要求。