在Python中实现加密解密算法有多种方式,包括使用内置库如cryptography、hashlib、base64等,以及使用简单的算法如AES、DES等。下面我将介绍几种常用的加密解密方法。
1. 使用cryptography库
cryptography是一个强大的加密库,支持多种加密算法,包括对称加密(如AES)和非对称加密(如RSA)。
安装cryptography
pip install cryptography
(1)AES对称加密解密示例
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import os# 密钥和初始化向量生成
key = os.urandom(32) # AES-256, 32 bytes
iv = os.urandom(16) # AES block size is 16 bytes# 密码派生函数生成密钥
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=100000, backend=default_backend())
key = kdf.derive(b"my_secret_password")# 加密函数
def encrypt(data, key, iv):padder = padding.PKCS7(algorithms.AES.block_size).padder()padded_data = padder.update(data) + padder.finalize()cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())encryptor = cipher.encryptor()ct = encryptor.update(padded_data) + encryptor.finalize()return ct, salt, iv # 返回密文和盐值和初始化向量# 解密函数
def decrypt(ct, key, iv):cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())decryptor = cipher.decryptor()padded_data = decryptor.update(ct) + decryptor.finalize()unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()data = unpadder.update(padded_data) + unpadder.finalize()return data# 使用示例
data = b"Hello, World!"
ciphertext, salt, iv = encrypt(data, key, iv)
print("Encrypted:", ciphertext)
print("Decrypted:", decrypt(ciphertext, key, iv).decode())
(2)SM4加密解密示例
SM4是中国国家标准的对称加密算法,类似于AES。下面是一个使用cryptography
库进行SM4加密和解密的示例:
# 加密
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
import os# 生成一个随机的密钥和IV(初始化向量)
key = os.urandom(32) # SM4密钥长度为32字节
iv = os.urandom(16) # IV长度为16字节# 待加密的数据
data = "Hello, SM4 encryption!".encode('utf-8')# 添加填充(PKCS7)
padder = padding.PKCS7(128).padder()
padded_data = padder.update(data) + padder.finalize()# 创建cipher对象
cipher = Cipher(algorithms.SM4(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()# 加密数据
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
print("Encrypted:", encrypted_data.hex())# 解密
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
import os# 密钥和IV(初始化向量)应与加密时使用的相同
key = os.urandom(32) # 应与加密时使用的密钥相同
iv = os.urandom(16) # 应与加密时使用的IV相同# 加密的数据(从上面获取或通过网络接收)
encrypted_data = bytes.fromhex("你的加密数据") # 替换为实际的加密数据# 创建cipher对象进行解密
cipher = Cipher(algorithms.SM4(key), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()# 解密数据并移除填充
decrypted_padded_data = decryptor.update(encrypted_data) + decryptor.finalize()
unpadder = padding.PKCS7(128).unpadder()
decrypted_data = unpadder.update(decrypted_padded_data) + unpadder.finalize()
print("Decrypted:", decrypted_data.decode('utf-8'))
注意事项:
-
密钥和IV:在加密和解密时,密钥和IV必须完全相同。通常,这些应该通过安全的方式传输和存储。
-
填充:在对数据进行加密前,通常需要添加填充以确保数据长度符合块大小的要求。解密时需要移除填充。这里使用了PKCS7填充。
-
安全性:确保使用足够安全的随机数生成器(如
os.urandom
)来生成密钥和IV。不要在代码中硬编码密钥和IV。 -
环境配置:确保你的Python环境支持SM4算法,这通常需要较新版本的
cryptography
库。可以通过pip install --upgrade cryptography
来升级库。
2、使用hashlib进行哈希加密(不涉及解密)
hashlib用于生成数据的哈希值,而不是加密,因为哈希是不可逆的。但可以用来验证数据完整性。
import hashlibdata = "Hello, World!".encode()
hash_object = hashlib.sha256(data)
hex_dig = hash_object.hexdigest()
print("Hash:", hex_dig)
3. 使用base64进行编码(不是加密,但常用于编码和解码)
import base64data = b"Hello, World!"
encoded = base64.b64encode(data)
decoded = base64.b64decode(encoded)
print("Encoded:", encoded)
print("Decoded:", decoded) # 注意:解码后是bytes类型,需要解码为str才能显示文本内容。
print("Decoded String:", decoded.decode()) # 显示文本内容。
这些方法涵盖了从基本的编码解码到复杂的对称和非对称加密。选择哪种方法取决于具体需求,比如是否需要保密性、完整性或是仅仅是需要验证数据的完整性。对于需要保密性的场景,建议使用如AES的对称加密方法。对于需要公钥/私钥对的场景,可以考虑使用RSA等非对称加密算法。
另外还整理了一些优秀的加解密算法方面的博文方便今后查阅:
《python 加密与解密》
《python实现加密需求》
《用python加密文件与解密文件》
《使用纯Python算法实现非对称加密解密算法》
《python sm4加密和解密》
《Python实现SM4加解密算法》
《python 实现base64加密和base64解密算法》
《Python实现BASE64 算法》
《base64 --- Base16, Base32, Base64, Base85 数据编码》