分组加密算法的基本概念
在日常网络通信中,我们发送的每一条消息都可能被截获。比如你在咖啡馆连Wi-Fi转账时,如果数据没加密,黑客就能轻易看到金额和账户。分组加密就是把明文切成固定长度的块,再逐个加密,常见的块大小是64位或128位。
常见的工作模式
分组加密不是只有一种玩法。不同的工作模式决定了数据如何被处理。最基础的是ECB(电子密码本)模式,每个数据块独立加密。听起来简单,但同一个明文块会生成相同的密文块,容易暴露数据结构。比如一张黑白图片,即使加密后,轮廓依然能从密文图像中看出来。
更安全的做法是使用CBC(密码分组链接)模式。它引入了一个初始向量(IV),每个明文块在加密前会和前一个密文块做异或运算。这样一来,同样的明文在不同位置会产生不同的密文,安全性大大提升。
CBC模式代码示例
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes
key = get_random_bytes(16) # 128位密钥
iv = get_random_bytes(16) # 初始化向量
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = b"Hello, this is a secret message!"
padded_text = pad(plaintext, AES.block_size)
ciphertext = cipher.encrypt(padded_text)
CTR模式:让加密像流水线
如果你需要并行处理数据,比如视频流实时加密,CTR(计数器)模式就很合适。它不需要依赖前一个密文块,而是用一个递增的计数器值加密后与明文异或。这种模式下,加密过程可以多线程同时进行,效率高,适合现代高性能场景。
选择合适的填充方式
明文长度不一定刚好是块大小的整数倍。这时候就得填充。PKCS#7是最常用的填充标准。比如还差3个字节到16字节块,就填三个0x03。解密时系统会自动识别并去掉这些多余字节。别小看这一步,填错可能导致整个解密失败。
实际应用中的注意事项
密钥管理比算法本身更重要。哪怕你用了AES-256,把密钥写在代码里或者用弱密码生成,一样会被攻破。建议结合密钥派生函数如PBKDF2,用用户密码加盐生成真正密钥。
另外,别自己造轮子。虽然理解原理很重要,但在真实项目中应优先使用成熟库,比如OpenSSL、Libsodium或Python的pycryptodome。这些库经过大量实战检验,比自研方案可靠得多。