别再死记硬背了!用Python代码实战AES和RSA,5分钟搞懂对称与非对称加密的区别
·
用Python代码实战AES和RSA:5分钟掌握加密核心差异
加密技术就像数字世界的锁与钥匙——但为什么有的锁用同一把钥匙开闭(AES),有的却需要两把不同的钥匙(RSA)?今天我们不谈枯燥的理论,直接动手写代码,让加密过程自己"说话"。
1. 环境准备与基础概念
在开始前,确保已安装Python 3.8+和 pycryptodome 库:
pip install pycryptodome
对称加密 就像保险箱的机械锁——加密解密用同一把钥匙(密钥)。它的典型代表是AES算法,处理速度快,适合加密大量数据。但问题在于:如何安全地把钥匙交给对方?
非对称加密 则像现代电子锁系统:公钥是任何人都能用的锁头,私钥是唯一能开锁的指纹。RSA是这类算法的代表,虽然速度慢,但彻底解决了密钥分发难题。
提示:实际系统中常组合使用两者——用RSA传递AES密钥,再用AES加密主体数据
2. AES对称加密实战
让我们实现一个完整的AES加密流程。注意观察:相同输入永远产生相同输出。
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
# 密钥必须是16/24/32字节长度
key = b'this_is_a_test_key_32_bytes_long!'
data = "我是需要保护的敏感数据"
# 加密过程
cipher = AES.new(key, AES.MODE_CBC) # 使用CBC模式
ct_bytes = cipher.encrypt(pad(data.encode(), AES.block_size))
iv = cipher.iv # 初始化向量
encrypted = base64.b64encode(iv + ct_bytes).decode()
print(f"加密结果:{encrypted}")
# 解密过程
raw = base64.b64decode(encrypted)
iv, ct = raw[:16], raw[16:] # 分离IV和密文
cipher = AES.new(key, AES.MODE_CBC, iv=iv)
pt = unpad(cipher.decrypt(ct), AES.block_size).decode()
print(f"解密结果:{pt}")
关键观察点:
- 每次运行加密结果相同(前提是IV固定)
- 加密解密使用完全相同的密钥
- 必须处理数据块大小对齐(使用pad/unpad)
AES典型参数对比 :
| 参数类型 | 可选值 | 安全建议 |
|---|---|---|
| 密钥长度 | 128/192/256位 | 推荐256位 |
| 工作模式 | ECB/CBC/CFB等 | 避免ECB模式 |
| 填充方案 | PKCS7/ISO7816 | 使用标准PKCS7 |
3. RSA非对称加密实战
现在实现RSA加密,注意每次运行结果都不同:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 加密函数
def rsa_encrypt(pub_key, message):
cipher = PKCS1_OAEP.new(RSA.import_key(pub_key))
return base64.b64encode(cipher.encrypt(message.encode()))
# 解密函数
def rsa_decrypt(priv_key, ciphertext):
cipher = PKCS1_OAEP.new(RSA.import_key(priv_key))
return cipher.decrypt(base64.b64decode(ciphertext)).decode()
# 测试加密
message = "机密交易数据"
encrypted = rsa_encrypt(public_key, message)
print(f"加密结果:{encrypted.decode()}")
# 测试解密
decrypted = rsa_decrypt(private_key, encrypted)
print(f"解密结果:{decrypted}")
RSA的核心特点:
- 公钥加密的数据只能用私钥解密
- 每次加密结果不同(因随机填充机制)
- 密钥对生成涉及大素数运算
RSA与AES性能对比测试 :
import timeit
# 测试AES速度
aes_time = timeit.timeit(
lambda: cipher.encrypt(pad(data.encode(), AES.block_size)),
setup='from __main__ import cipher, data, AES, pad',
number=1000
)
# 测试RSA速度
rsa_time = timeit.timeit(
lambda: rsa_encrypt(public_key, message),
setup='from __main__ import rsa_encrypt, public_key, message, RSA, PKCS1_OAEP',
number=100
)
print(f"AES 1000次加密耗时:{aes_time:.3f}秒")
print(f"RSA 100次加密耗时:{rsa_time:.3f}秒")
典型输出结果:
- AES:约0.2秒/千次
- RSA:约1.5秒/百次
4. 混合加密系统实战
结合两者优势的典型方案:
def hybrid_encrypt(rsa_pub_key, data):
# 生成随机AES密钥
aes_key = get_random_bytes(32) # AES-256
# 用AES加密数据
cipher = AES.new(aes_key, AES.MODE_GCM)
ct, tag = cipher.encrypt_and_digest(data.encode())
# 用RSA加密AES密钥
rsa_cipher = PKCS1_OAEP.new(RSA.import_key(rsa_pub_key))
enc_key = rsa_cipher.encrypt(aes_key)
return {
'ciphertext': base64.b64encode(ct).decode(),
'tag': base64.b64encode(tag).decode(),
'nonce': base64.b64encode(cipher.nonce).decode(),
'encrypted_key': base64.b64encode(enc_key).decode()
}
def hybrid_decrypt(rsa_priv_key, encrypted_data):
# RSA解密AES密钥
rsa_cipher = PKCS1_OAEP.new(RSA.import_key(rsa_priv_key))
aes_key = rsa_cipher.decrypt(base64.b64decode(encrypted_data['encrypted_key']))
# AES解密数据
cipher = AES.new(aes_key, AES.MODE_GCM,
nonce=base64.b64decode(encrypted_data['nonce']))
pt = cipher.decrypt_and_verify(
base64.b64decode(encrypted_data['ciphertext']),
base64.b64decode(encrypted_data['tag'])
)
return pt.decode()
这种架构的典型应用场景包括:
- HTTPS/SSL协议
- 加密文件传输系统
- 安全即时通讯工具
5. 关键差异与选型指南
通过实际代码测试,我们可以总结出核心差异:
密钥管理 :
- AES:单密钥,需安全通道传输
- RSA:密钥对,公钥可公开分发
性能对比 :
| 指标 | AES-256 | RSA-2048 |
|---|---|---|
| 加密速度 | ~500MB/s | ~0.1MB/s |
| 适合场景 | 大数据量 | 小数据量 |
安全特性 :
- AES:依赖密钥保密性
- RSA:依赖大整数分解难度
重要提示:实际应用中永远不要自己实现加密算法,应使用经过验证的库(如Python的cryptography)
在金融级应用中,我通常会这样选择:
- 用户密码存储:AES加密+盐值哈希
- API通信:RSA交换密钥+AES加密数据
- 数字签名:RSA私钥签名+公钥验证
更多推荐
所有评论(0)