Python常用加密解密算法对比与代码实现
本文系统梳理 Python 中常用的数据编码、单向摘要、对称与非对称加密算法。通过实际代码演示 URL Encode、Unicode、Base64、MD5、SHA、HMAC、PBKDF2、DES、3DES、AES、RC4 及 RSA 的核心用法与参数配置,提供安全场景下的选型建议与依赖安装指引,帮助开发者快速集成符合业务需求的加解密模块。
环境准备与依赖安装
Python 内置模块已覆盖基础编码与哈希计算。部分高级算法需引入第三方安全库。执行前建议创建虚拟环境并安装依赖:
pip install pycryptodome pydes rsa
注意:生产环境中请勿硬编码密钥,应配合环境变量或密钥管理服务读取。涉及覆盖或写入敏感文件的场景,建议提前备份原始配置文件。
基础编码转换操作
此类方法主要用于数据格式规范化,不具备机密性保护能力,常用于接口传参与文本序列化。
第1步:URL 参数转义与解码
目的:解决 URL 含中文或特殊符号导致的解析异常。
操作入口:import urllib.parse
动作:使用 quote() 编码,unquote() 还原。
重要参数:待处理字符串。
完成状态:输出百分号编码格式,重新解码后与原文一致。
import urllib.parse
text = "我爱吃鸡腿"
s = urllib.parse.quote(text)
u = urllib.parse.unquote(s)
print(s) # %E6%88%91%E7%88%B1%E5%90%83%E9%B8%A1%E8%85BF
print(u) # 我爱吃鸡腿
第2步:Unicode 转义与还原
目的:将中文或特殊字符转为 Unicode 序列,常见于 JSON 序列化或前端兼容处理。
操作:利用字符串的 encode('unicode-escape') 进行转义。
完成状态:得到形如 \uXXXX 的安全 ASCII 字符串。
str1 = "你好"
enStr1 = str1.encode('unicode-escape').decode()
deStr1 = enStr1.encode().decode('unicode-escape')
print(enStr1) # \u4f60\u597d
print(deStr1) # 你好
第3步:Base64 二进制编解码
目的:将任意二进制数据映射为 64 个可见字符,广泛用于附件传输与 Token 封装。
操作:调用 base64.b64encode() 与 b64decode()。
注意:输入需先转为 bytes,输出默认带换行符,可读化时可追加 strip()。
完成状态:编码串长度符合 4 的倍数基准,二次解码还原原始字节流。
import base64
def base64_encode(text):
return base64.b64encode(text.encode()).decode()
def base64_decode(encode_data):
return base64.b64decode(encode_data).decode()
result_enc = base64_encode("I love Python!")
result_dec = base64_decode(result_enc)
print(result_enc) # SSBsb3ZlIFB5dGhvbiE=
print(result_dec) # I love Python!
单向摘要与消息认证算法
摘要算法具有确定性且不可逆,密文长度固定。适用于完整性校验、密码存储与数字签名基础组件。
第4步:MD5 哈希计算
目的:生成固定 32 位十六进制指纹,验证文件一致性。
操作:使用 hashlib.md5() 或 hashlib.new('md5')。
注意:易受碰撞攻击,仅推荐用于非安全场景的数据去重或校验,严禁直接存储用户密码。
完成状态:输出 32 位小写 hex 字符串。
import hashlib
# 方式1:一次性传入
md5_1 = hashlib.md5(b'I love python!').hexdigest()
# 方式2:分块更新(适合流式数据)
md5_2 = hashlib.md5()
md5_2.update(b'I love ')
md5_2.update(b'python!')
print(md5_1 == md5_2.hexdigest()) # True
第5步:SHA 系列安全哈希
目的:替代 MD5 提升碰撞抗性。SHA-1 输出 40 位,SHA-256 输出 64 位,版本越强哈希越长但计算开销略增。
操作:调用 hashlib.sha1() 或其他变体。
完成状态:返回对应长度的十六进制摘要。
sha1_val = hashlib.sha1(b'I love python!').hexdigest()
print(sha1_val) # 23c02b203bd2e2ca19da911f1d270a06d86719fb
第6步:HMAC 密钥相关消息认证
目的:结合共享密钥与哈希函数,防止中间人篡改报文。
操作:导入 hmac 模块,指定 key、message 与 digestmod。
重要参数:双方需严格约定同一 secret key。
完成状态:客户端与服务端独立计算出的 hexdigest 完全匹配。
import hmac
msg = b'I love python!'
key = b'secret'
h = hmac.new(key, msg, digestmod='md5').hexdigest()
print(h) # 9c503a1f852edcc3526ea56976c38edf
第7步:PBKDF2 密钥派生
目的:通过多次迭代哈希加盐值(salt),大幅抬高暴力破解成本。
<操作:使用 Cryptodome.Protocol.KDF.PBKDF2。
重要参数:count 建议设置为数万至十万级;salt 需为随机字节串。
完成状态:输出定长派生密钥,可用于后续对称加密。
import binascii
from Cryptodome.Hash import SHA1
from Cryptodome.Protocol.KDF import PBKDF2
password = b'I love Python!'
salt = b'random_salt_8b'
derived = PBKDF2(password, salt, count=100000, hmac_hash_module=SHA1)
print(binascii.hexlify(derived))
对称加密算法实操
加密与解密共用同一密钥。速度快,适合大体积数据,但需安全分发密钥。
第8步:DES 与 3DES 分组加密
目的:历史标准。DES 有效密钥仅 56 位,已被 AES 取代;3DES 通过三次运算增强强度。
操作:DES 可使用 pyDes 库;3DES 推荐使用 Cryptodome.Cipher.DES3。
注意:均需提供固定长度密钥与初始向量(IV),支持 ECB/CBC 等模式与 PKCS7/PKCS5 填充。
完成状态:密文长度对齐区块倍数,解密后还原明文。
from Cryptodome.Cipher import DES3
from Cryptodome import Random
key = b'1234567801234567' # 3DES 要求 16/24 字节
iv = Random.new().read(8)
cipher_e = DES3.new(key, DES3.MODE_OFB, iv)
enc = cipher_e.encrypt(b'I love Python!')
cipher_d = DES3.new(key, DES3.MODE_OFB, iv)
dec = cipher_d.decrypt(enc)
print(dec) # b'I love Python!'
第9步:AES 高级加密标准
目的:当前主流对称算法,抗性强、性能优异。支持 128/192/256 位密钥。
操作:使用 Cryptodome.Cipher.AES,推荐 CBC 或 GCM 模式搭配 PKCS7 填充。
重要参数:密钥长度必须匹配;IV 每次加密应随机生成并随密文一同存储/传输。
完成状态:Base64 编码后可见乱码串,正确配对密钥与 IV 可无损还原。
import base64
from Cryptodome.Cipher import AES
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return value.encode()
key = b'1234567812345678'
iv = b'1234567812345678'
aes_obj = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv))
encrypted = aes_obj.encrypt(add_to_16(b'I love Python!'))
b64_enc = base64.encodebytes(encrypted).decode()
aes_dec = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv))
raw_dec = aes_dec.decrypt(base64.decodebytes(b64_enc.encode()))
print(raw_dec.replace(b'\x00', b'')) # b'I love Python!'
第10步:RC4 流加密(仅作兼容参考)
目的:早期协议兼容。速度极快,但已被证实存在多项严重漏洞,TLS 1.3 已彻底禁用。
操作:Cryptodome.Cipher.ARC4。
安全提示:新项目严禁使用,此处保留仅供逆向历史数据使用。
完成状态:加解密对称,输出 Base64 流。
from Cryptodome.Cipher import ARC4
cipher = ARC4.new(b'12345678')
enc = cipher.encrypt(b'I love Python!')
b64 = base64.b64encode(enc)
print(b64)
非对称加密算法实操
包含公钥与私钥对。公钥公开用于加密,私钥保密用于解密;或反之用于数字签名。
第11步:RSA 密钥交换与加解密
目的:解决对称加密密钥分发难题,广泛应用于身份认证与数据传输。
操作:使用 rsa 库生成密钥对,调用 encrypt/decrypt;或使用 Cryptodome 处理 PEM 导入。
重要参数:密钥长度建议 ≥ 2048 位,短密钥极易被分解。
完成状态:公钥加密的数据仅能用对应私钥还原,成功打印原始字符串。
import rsa
pub_key, pri_key = rsa.newkeys(2048)
original = b'I love Python!'
encrypted = rsa.encrypt(original, pub_key)
decrypted = rsa.decrypt(encrypted, pri_key)
print(decrypted.decode()) # I love Python!
算法选型与安全建议
- 接口参数/文本序列化:优先选 URL Encode、Base64。
- 数据完整性/密码存储:放弃 MD5/SHA-1,采用 SHA-256 + Salt,或直接使用 PBKDF2/Argon2。
- 常规业务数据加密:AES-256-CBC 或 GCM 为行业基准,配合随机 IV 使用。
- 密钥交换/数字签名:RSA ≥ 2048 位,或转向 ECC 曲线提高算力效率。
- 历史遗留系统:DES/3DES/RC4/MD5 仅限内网兼容或数据迁移过渡,新开发务必升级。
以上就是 Python 常见加密解密算法对比与代码实现的详细内容,更多关于 Python 数据处理与安全编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













