1、理解
加密是通过使用各种加密算法来对数据进行加密和解密的过程。Python 提供了许多内置库和第三方库,可以用于实现各种加密算法和技术,包括对称加密、非对称加密、哈希函数等。以下是 Python 中常用的一些加密相关的库和模块:
- hashlib 模块:Python 的 hashlib 模块提供了常见的哈希函数,如 MD5、SHA-1、SHA-256 等,用于生成数据的哈希值。
- cryptography 模块:cryptography 是一个功能强大且易于使用的加密库,支持对称加密、非对称加密、数字签名等操作。
- PyCrypto 模块:PyCrypto 是一个密码学工具包,提供了各种加密算法的实现,包括对称加密算法(如 AES、DES)、非对称加密算法(如 RSA)、消息认证码(MAC)等。
- PyCryptodome 模块:PyCryptodome 是 PyCrypto 的一个分支,提供了更多的加密算法和功能,并在性能和安全性上有所改进。
- cryptography.fernet 模块:cryptography 库中的 fernet 模块提供了 Fernet 对称加密算法的实现,用于简单且安全的加密和解密数据。
- PyJWT 模块:PyJWT 是用于 JSON Web Token(JWT)的 Python 库,用于生成和验证 JWT,通常用于身份验证和信息交换。
2、对称加密和非对称加密
对称加密和非对称加密是两种常见的加密算法,它们在加密和解密数据时使用不同的密钥管理方式。
-
对称加密:
- 定义:对称加密使用相同的密钥来加密和解密数据。加密和解密过程使用相同的密钥,因此称为对称加密。
- 常见算法:常见的对称加密算法包括 AES(高级加密标准)、DES(数据加密标准)和 3DES 等。
- 示例:以下是一个使用 PyCryptodome 模块进行 AES 对称加密和解密的简单示例:
from Crypto.Cipher import AES from Crypto.Random import get_random_bytes# 生成随机密钥 key = get_random_bytes(16)# 要加密的数据 data = b"Hello, World!"# 创建 AES 加密对象 cipher = AES.new(key, AES.MODE_EAX)# 加密数据 ciphertext, tag = cipher.encrypt_and_digest(data)print("加密后的数据:", ciphertext)# 解密数据 cipher = AES.new(key, AES.MODE_EAX, cipher.nonce) decrypted_data = cipher.decrypt_and_verify(ciphertext, tag)print("解密后的数据:", decrypted_data.decode('utf-8'))
-
非对称加密:
- 定义:非对称加密使用一对密钥,公钥和私钥,其中公钥用于加密数据,私钥用于解密数据。这种加密方式也称为公钥加密。
- 常见算法:常见的非对称加密算法包括 RSA、DSA 和 ECC(椭圆曲线加密)等。
- 示例:以下是一个使用 cryptography 模块进行 RSA 非对称加密和解密的简单示例:
from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes# 生成 RSA 密钥对 private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) public_key = private_key.public_key()# 加密数据 data = b"Hello, World!" ciphertext = public_key.encrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))print("加密后的数据:", ciphertext)# 解密数据 decrypted_data = private_key.decrypt(ciphertext, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))print("解密后的数据:", decrypted_data.decode('utf-8'))
加密和解密算法和方法比较多,在实际应用中,我们需要根据具体的安全需求和情景来选择合适的加密算法和方法。