《物联网数据加密技术实战》
第3章 对称加密算法(AES)
3、对称加密算法(AES)
3.1 AES 原理概述
AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准,用于替代原先的 DES。AES 属于对称加密算法,即加密和解密使用相同的密钥。其核心原理基于 代换-置换网络(SPN),通过多轮重复的“字节代换”、“行移位”、“列混合”和“轮密钥加”操作,将明文数据彻底打乱,从而保证数据机密性。
📌 AES 加密流程(128位数据块)
3.2 密钥长度与轮数
AES 支持三种密钥长度,对应不同的安全强度和加密轮数:
🔑 密钥长度与安全强度对比
3.3 工作模式详解
AES 作为分组密码,需要配合工作模式来处理超过 128 位的数据。以下是五种常见模式:
📊 五种工作模式对比
🔄 CBC 模式加密流程示意图
3.4 填充方式
由于 AES 是分组密码(每组 16 字节),当明文长度不是 16 的倍数时,需要进行填充。常见的填充方式如下:
- 🔹 PKCS7 / PKCS5:最常用,缺几个字节就填充几个值为该数量的字节。例如缺 3 字节,则填充 0x03 0x03 0x03。
- 🔹 Zero Padding:用 0x00 填充剩余字节。缺点是无法区分数据末尾的 0 与填充的 0。
- 🔹 ISO 10126:最后一个字节为填充字节数,其余填充随机字节(已废弃)。
- 🔹 ANSI X.923:填充 0x00,最后一个字节为填充字节数。
- 🔹 No Padding:要求明文长度必须是 16 的倍数,否则报错。
📦 PKCS7 填充示例(明文 10 字节,需填充 6 字节)
3.5 Python 代码示例(AES-CBC 加密与解密)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
# 生成随机密钥和 IV
key = os.urandom(16) # AES-128
iv = os.urandom(16)
# 待加密数据
plaintext = b"Hello, IoT Security! AES-CBC Mode."
# 加密
cipher = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
print("密文 (hex):", ciphertext.hex())
# 解密
cipher_dec = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher_dec.decrypt(ciphertext), AES.block_size)
print("解密结果:", decrypted.decode())
💡 安全提示
- ❌ ECB 模式:相同明文块产生相同密文块,存在模式泄露风险,禁止用于加密敏感数据。
- ✅ 推荐使用 CBC 或 CTR 模式,并配合随机 IV(初始化向量)。
- 🔑 AES-256 提供最高安全等级,适用于物联网网关、云端数据存储等场景。
- 📦 填充方式建议使用 PKCS7,兼容性最好。
专注课程资料整理