Python常用加密解密算法对比与代码实现

蓝鲸
蓝鲸
发布时间:2026-10-12 | 2人浏览过
原创

本文系统梳理 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 数据处理与安全编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表