以下是对您提供的代码片段的详细讲解:
非对称加密算法RSA
密钥对生成
from cryptography.hazmat.primitives.asymmetric import rsa
# 固定密钥对
private_key = rsa.generate_private_key(
public_exponent=65537, # 公钥指数,通常使用65537
key_size=2048, # 密钥长度,2048位是常见的选择
)
public_key = private_key.public_key() # 从私钥生成公钥
rsa.generate_private_key
:生成RSA私钥。public_exponent
:公钥指数,通常使用65537,因为它是一个常用的费马素数,具有良好的加密性能。key_size
:密钥长度,2048位是目前广泛使用的长度,提供了较强的安全性。
private_key.public_key()
:从私钥生成公钥,公钥用于加密数据,私钥用于解密数据。
加密和解密
from cryptography.hazmat.primitives.asymmetric import padding
# 固定明文
message = b"3212"
# 加密消息
encrypted = public_key.encrypt(
message,
padding.PKCS1v15() # 使用PKCS1 v1.5填充模式
)
# 解密消息
decrypted = private_key.decrypt(
encrypted,
padding.PKCS1v1.5() # 使用PKCS1 v1.5填充模式
)
print("Encrypted (hex):", encrypted.hex())
print("Decrypted:", decrypted.decode())
public_key.encrypt
:使用公钥加密数据。padding.PKCS1v15()
:指定填充模式为PKCS1 v1.5,这是一种常用的填充模式,适用于加密数据。
private_key.decrypt
:使用私钥解密数据。padding.PKCS1v1.5()
:指定填充模式与加密时相同,以确保正确解密。
encrypted.hex()
:将加密后的字节数据转换为十六进制字符串,方便查看和存储。decrypted.decode()
:将解密后的字节数据解码为字符串,恢复原始明文.
再次加密相同的消息
# 再次加密相同的消息,以检查结果是否固定
encrypted_again = public_key.encrypt(
message,
padding.PKCS1v15() # 使用PKCS1 v1.5填充模式
)
print("Encrypted again (hex):", encrypted_again.hex())
- 使用相同的公钥和填充模式再次加密相同的明文,可以检查加密结果是否一致。对于PKCS1 v1.5填充模式,加密结果是固定的,即相同的明文和密钥会产生相同的加密结果.
对称加密算法AES
AES加密和解密函数
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
# AES加密
def aes_encrypt(plaintext, key, iv):
# 确保key是16, 24或32字节长
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv=iv.encode('utf-8'))
ct_bytes = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))
return ct_bytes
# AES解密
def aes_decrypt(ct, key, iv):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv=iv.encode('utf-8'))
pt = unpad(cipher.decrypt(ct), AES.block_size)
return pt.decode('utf-8')
AES.new
:创建一个新的AES加密器。key.encode('utf-8')
:将密钥字符串转换为字节数据,AES密钥长度可以是16, 24或32字节。AES.MODE_CBC
:指定加密模式为CBC(Cipher Block Chaining),这是一种常用的块加密模式.iv=iv.encode('utf-8')
:将初始化向量(IV)字符串转换为字节数据,IV长度必须是16字节.
pad
:对明文数据进行填充,使其长度为AES块大小(16字节)的倍数,以便进行加密。cipher.encrypt
:执行加密操作,返回加密后的字节数据.unpad
:去除解密后的数据填充,恢复原始明文长度.cipher.decrypt
:执行解密操作,返回解密后的字节数据.
使用示例
# 使用示例
key = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldY" # 密钥长度可以是16, 24或32字节
iv = "QUJDREVGR0hJSktM" # 初始化向量,长度必须是16字节
plaintext = "3212" # 明文
# 加密
encrypted = aes_encrypt(plaintext, key, iv)
print(f'Encrypted: {encrypted.hex()}')
# 解密
decrypted = aes_decrypt(encrypted, key, iv)
print(f'Decrypted: {decrypted}')
- 密钥和初始化向量:密钥和IV是AES加密和解密的关键参数,必须正确设置和传递.
- 加密和解密操作:通过调用
aes_encrypt
和aes_decrypt
函数,分别对明文进行加密和对密文进行解密. - 输出结果:打印加密后的十六进制字符串和解密后的明文字符串,验证加密和解密的正确性.
这些代码展示了如何使用Python的加密库实现非对称加密算法RSA和对称加密算法AES的基本操作。RSA适用于加密少量数据或密钥交换,AES适用于加密大量数据,两者在实际应用中可以根据需求选择使用.