Python密码学的深入探索:使用PyCrypto库进行加密与解密
PyCrypto库是一个用于密码学的第三方Python库,提供了多种加密和解密的功能。然而,请注意,PyCrypto的开发已经停止,PyCryptodome是一个积极维护的分支,建立在PyCrypto的基础之上。因此,我建议你使用PyCryptodome进行密码学操作。
下面是如何使用PyCryptodome库进行对称加密(以AES为例)的基本示例:
安装PyCryptodome
首先,你需要安装PyCryptodome库,可以使用pip命令:
pip install pycryptodome
AES加密与解密示例
以下是一个基本的AES加密和解密的示例代码:
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
def pad(data):
"""Pad data to be a multiple of 16 bytes"""
while len(data) % 16 != 0:
data += ' '
return data
def encrypt(key, data):
"""Encrypt data with AES algorithm"""
cipher = AES.new(key, AES.MODE_ECB)
encrypted_data = cipher.encrypt(pad(data).encode('utf-8'))
return base64.b64encode(encrypted_data).decode('utf-8')
def decrypt(key, encrypted_data):
"""Decrypt data with AES algorithm"""
cipher = AES.new(key, AES.MODE_ECB)
encrypted_data_bytes = base64.b64decode(encrypted_data)
decrypted_data = cipher.decrypt(encrypted_data_bytes)
return decrypted_data.decode('utf-8').rstrip()
# Key must be either 16, 24, or 32 bytes long
key = get_random_bytes(16) # Generate random 16-byte key
data = "Hello, World!"
# Encrypt the data
encrypted = encrypt(key, data)
print(f"Encrypted: {encrypted}")
# Decrypt the data
decrypted = decrypt(key, encrypted)
print(f"Decrypted: {decrypted}")
注意事项
密钥长度:AES算法的密钥长度可以为16、24或32字节,分别对应AES-128,AES-192和AES-256。
填充:在ECB模式下,如果数据不是16字节的倍数,则需要进行填充。在上面的例子中,为了简单起见,使用了空格来填充。但在生产环境中,建议使用更标准的填充方式,比如PKCS7。
安全性:ECB模式尽管简单,但并不安全,因为相同的明文块会被映射为相同的密文块。建议使用更安全的模式,如CBC(需要IV)或GCM(提供完整性验证)。
数据存储与传输:在实际应用中,加密后的数据通常需要Base64编码来方便存储和传输。
如果你需要更复杂的功能(例如非对称加密),PyCryptodome库也提供了丰富的支持,可以参考其官方文档以获取更多信息。