免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
目录
一:分组密码的填充方式
1. PKCS#7/PKCS#5
-
原理:填充值为需填充的字节数。例如,若块大小为8字节,需填充3字节,则填充
0x03 0x03 0x03
。 -
特点:
-
PKCS#5专为8字节块设计(如DES),PKCS#7支持1-255字节块(如AES)。
-
数据长度恰好为块大小时,填充完整新块(如16字节块填充16个
0x10
)。
-
-
应用:广泛用于SSL/TLS、CMS等协议,兼容性强。
2. ANSI X.923
-
原理:填充字节的末字节为填充长度,其余为
0x00
。例如,填充3字节则为0x00 0x00 0x03
。 -
特点:解密时校验填充字节前部分是否为
0x00
,否则报错,增强安全性。 -
应用:部分金融或旧系统标准中可能要求。
3. ISO 10126
-
原理:末字节为填充长度,其余为随机数。例如,填充3字节可能为
0xAB 0xCD 0x03
。 -
特点:随机填充增加密文随机性,减少攻击面,但需注意该标准已撤销。
-
应用:曾用于需高随机性的场景,现逐渐被替代。
4. 补零填充
-
原理:填充
0x00
至块大小。例如,需填充3字节则为0x00 0x00 0x00
。 -
缺点:若原始数据以
0x00
结尾,解密时无法区分填充与数据,需额外长度信息。 -
应用:适用于数据本身不含
0x00
或协议明确处理长度的情况。
5. 无填充
-
条件:数据长度必须为块大小的整数倍。
-
应用:结合流模式(如CTR、OFB)或固定长度数据(如哈希值)。
示例场景
-
AES-CBC加密:使用PKCS#7填充,处理任意长度数据。
-
DES加密:PKCS#5填充,兼容8字节块。
-
固定长度令牌:无需填充,直接加密。
方式 | 描述 |
---|---|
NoPadding | 不填充 |
补零填充 | 填充 0 |
ANSI X9.23 | 最后一位填长度,其余填充 0 |
ISO10126 | 最后一位填长度,其余填充随机内容 |
PKCS5 和 PKCS7 | PKCS5 Padding—— 块大小 8 个字节 PKCS7 Padding—— 块大小 1~255 |
二:分组密码的工作模式
1. ECB(电子密码本模式)
-
原理:每个明文块独立加密,相同明文块生成相同密文块。
-
特点:
-
优点:简单、无需初始化向量(IV),支持并行加解密。
-
缺点:
-
相同明文生成相同密文,容易被破解。
-
无法抵御重放攻击。
-
-
-
应用场景:仅适用于加密单个数据块(如密钥加密),不推荐用于批量数据。
2. CBC(密码块链接模式)
-
原理:
-
每个明文块与前一个密文块异或后再加密,首个块使用随机IV。
-
解密时,先解密再与前一个密文块异或得到明文。
-
支持解密并行
-
-
特点:
-
优点:相同明文生成不同密文,隐藏数据模式。当一个数据块损坏时,不影响其他数据块界面,只影响它周围的2个数据块
-
缺点:
-
需要填充(如PKCS#7),错误传播影响后续两个块。
-
必须保证IV唯一且不可预测,否则可能被攻击。
-
加密不支持并行
-
-
-
应用场景:文件加密、早期SSL/TLS协议。
3. CFB(密码反馈模式)
-
原理:
-
将分组密码转换为自同步流密码。
-
前一个密文块加密后与明文异或生成密文,支持逐比特加密。
-
可并行解密
-
解密:利用异或运算的可逆性,利用前一个密文块加密后和现密文块进行异或解密
-
-
特点:
-
优点:无需填充,支持实时处理。
-
缺点:
-
错误传播:单个密文错误影响后续多个比特(取决于反馈位数)。
-
需要随机IV。
-
不支持并行加密
-
-
-
应用场景:流式数据传输(如实时通信)。
-
与CBC区别:CBC先异或在加密而CFB先加密在异或,CFB不需要填充而CBC需要
CFB加密:
CFB解密:
4. OFB(输出反馈模式)
-
原理:
-
生成密钥流(与明文无关),与明文异或生成密文。
-
密钥流通过迭代加密IV产生。
-
-
特点:
-
优点:无错误传播,适合高噪声信道。
-
缺点:
-
密钥流不可重复(否则导致安全性问题)。
-
需要随机IV。
-
不支持并行加解密
-
-
-
应用场景:卫星通信、需要抗干扰的场景。
OFB加密:
OFB解密:
5. CTR(计数器模式)
-
原理:
-
使用递增的计数器值加密生成密钥流,与明文异或。
-
计数器可以是随机数(Nonce)与块序号组合。
-
-
特点:
-
优点:
-
无填充、支持并行加密/解密。
-
错误不传播,高效适合硬件加速。
-
-
缺点:必须确保计数器唯一,否则密钥流重复导致明文泄露。
-
-
应用场景:网络协议(如IPSec、Wi-Fi加密)、高性能需求场景。
CTR加密:
CRT解密:
如何选择
-
安全性优先:选择认证加密模式(如GCM、CCM)。
-
性能需求:CTR或GCM模式适合高速加密。
-
兼容性:CBC仍广泛支持但需注意填充Oracle攻击防护。
-
错误容忍:OFB或CTR适用于易出错环境。
-
避免使用:ECB(除非加密单个块)。
对比内容 | ECB | CBC | CFB | OFB | CTR |
---|---|---|---|---|---|
工作方式 | 直接加密明文分组 | 对明文分组与前一个明文分组的异或结果加密 | 先加密前一个密文再与明文异或 | 先生成密钥流再与明文异或 | 将计数器加密后再与明文分组异或 |
需要填充 | √ | √ | × | × | × |
加密并行 | √ | × | × | × | √ |
解密并行 | √ | √ | √ | × | √ |
密文错误解密影响 | 当前明文 | 当前和下一个 | 当前和下一个 | 当前明文 | 当前明文 |
用途 | 传送短数据 | 传送数据分组;认证 | 传送数据分组;认证 | 有扰信道传送数据 | |
流密码 | × | × | √ | √ | √ |
三:AES
(图片来源:么是AES加密?详解AES加密算法原理流程 - 知乎)
1. 基本概述
AES(Advanced Encryption Standard)是一种对称加密算法,于2001年被美国国家标准与技术研究院(NIST)正式采用,取代了旧的DES(数据加密标准)。它由比利时密码学家Joan Daemen和Vincent Rijmen设计,原名Rijndael算法。
2. 核心特性
-
密钥长度:支持128位、192位、256位三种密钥,对应不同安全级别。
-
分组大小:固定128位(16字节)的数据块。
-
加密轮数:根据密钥长度决定轮数(10/12/14轮),每轮包含非线性变换、行移位、列混淆和轮密钥加等操作。
3.AES加密流程
-
密钥扩展(Key Expansion)
-
将128位主密钥扩展为11个128位轮密钥(首轮密钥为原始密钥,后续10轮通过算法生成)。
-
-
初始轮密钥加(AddRoundKey)
-
明文块与第1个轮密钥进行异或操作。(将16个字节明文变为4*4的矩阵,子密钥16个的字节也变为矩阵)
k1与p1异或以此类推得到如下矩阵
P1⊕K1 P2⊕K2 P3⊕K3 P4⊕K4 P5⊕K5 P6⊕K6 P7⊕K7 P8⊕K8 p 9 ⊕K9 P10⊕K10 P11⊕K11 P12⊕K12 p13⊕ k13 P14⊕K14 P15⊕K15 p16 页⊕K16
-
-
主轮处理(10轮循环)
每轮依次执行以下操作:-
字节代换(SubBytes):利用异或后的表格对照s盒进行替换(就是简单的替换)。
将如上经过初始轮秘钥加得到的表格对照s盒进行替换(比如d列4行以此类推)D4
e0
b 8
1e
27
Bf
b 4
41
11
98
5d
52
Ae
F1
E5
30
-
行移位(ShiftRows):将字节代换后的表格进行行移位。
行号 描述 第一行 保持不变 第二行 向左移动 1 个字节 第三行 向左移动 2 个字节 第四行 向左移动 3 个字节
(例如以字帖替换表为例行变后如左表)
-
列混淆(MixColumns):将行移位后的表格与设定的表格进行左乘
| 02 03 01 01 | | 01 02 03 01 | | 01 01 02 03 | (左乘) 行移位后表 | 03 01 01 02 |
-
轮密钥加(AddRoundKey):将列混合后的矩阵与本轮子密钥进行异或(参考:初始轮密钥加)
-
-
最终轮(第10轮)
-
跳过列混淆操作(仅执行SubBytes→ShiftRows→AddRoundKey)。
-
-
输出密文块
-
最终得到128位密文块,所有块处理完成后拼接为完整密文。
-
6.子秘钥扩展算法
W₀ = [k₀, k₁, k₂, k₃]
W₁ = [k₄, k₅, k₆, k₇]
W₂ = [k₈, k₉, k₁₀, k₁₁] 初始子密钥
W₃ = [k₁₂, k₁₃, k₁₄, k₁₅]
条件 | 等式确定规则 | 示例 |
---|---|---|
i 不是 4 的倍数 | W[i]=W[i - 4]⊕W[i - 1] | W5=W1⊕W4 ;W6=W2⊕W5 |
i 是 4 的倍数 | W[i]=W[i - 4]⊕T(W[i - 1]) | W4=W0⊕T(W3) |
i是4的倍数如下(T函数)
1.字循环
将前一个字循环左移1字节(例如,[k0,k1,k2,k3 → [k3,k0,k1,k2])。
2.字节替换
对字循环的结果使用s盒进行字节替换
3.轮常量异或
将前面的结果与轮常量进行异或,第一轮使用第一列轮常量,以此类推
最后将第一轮轮常量异或结果与w0进行异或就得到w4
7.python代码
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
# 加密函数
def aes_encrypt(plaintext, key):
# 将明文转换为字节
plaintext = plaintext.encode('utf-8')
# 生成随机初始化向量 (IV)
iv = get_random_bytes(AES.block_size)
# 创建 AES-CBC 加密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 填充并加密数据
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
# 组合 IV 和密文,并用 Base64 编码
encrypted_data = base64.b64encode(iv + ciphertext).decode('utf-8')
return encrypted_data
# 解密函数
def aes_decrypt(encrypted_data, key):
# Base64 解码
encrypted_data = base64.b64decode(encrypted_data)
# 提取 IV 和密文
iv = encrypted_data[:AES.block_size]
ciphertext = encrypted_data[AES.block_size:]
# 创建 AES-CBC 解密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 解密并去除填充
plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
return plaintext.decode('utf-8')
# 示例用法
if __name__ == "__main__":
# 生成随机 AES 密钥(支持 16/24/32 字节对应 AES-128/AES-192/AES-256)
key = get_random_bytes(32) # 使用 AES-256
# 原始文本
text = "Hello, AES 加密测试!"
# 加密
encrypted = aes_encrypt(text, key)
print("加密结果:", encrypted)
# 解密
decrypted = aes_decrypt(encrypted, key)
print("解密结果:", decrypted)
四:总结
对比维度 | AES | RC4 | DES |
---|---|---|---|
算法类型 | 分组密码(固定128位分组) | 流密码(逐字节加密) | 分组密码(固定64位分组) |
密钥长度 | 128/192/256位 | 40-2048位(通常40-256位) | 56位(实际64位,含8位校验) |
安全性 | 高(抗差分/线性攻击,现代标准) | 低(已被证明存在多漏洞,如WEP攻击) | 极低(密钥过短,易暴力破解) |
速度 | 较快(硬件加速优化后更高效) | 极快(无复杂运算,适合低性能设备) | 较慢(已被淘汰,性能不如AES) |
填充机制 | 需要(如PKCS#7) | 不需要(流密码特性) | 需要(如PKCS#5) |
应用场景 | 广泛(HTTPS、文件加密、硬件安全等) | 已弃用(曾用于SSL/TLS、WEP) | 遗留系统(被3DES或AES取代) |
是否被破解 | 未发现实用攻击(量子计算威胁待研究) | 已被广泛破解(如Fluhrer-Mantin-Shamir攻击) | 可暴力破解(数小时内) |
标准化情况 | NIST标准(FIPS 197) | 未标准化(现已被主流协议禁用) | NIST旧标准(FIPS 46-3,已淘汰) |
推荐使用 | ✅ 首选 | ❌ 禁用 | ❌ 禁用(仅3DES临时过渡) |
(至此关于对称密码的文章都已更新完毕,非对称密码已在路上感兴趣请关注)
(需要源代码联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)