首页/安全/加密与证书速查/雪崩效应与扩散性
加密算法基础95 条

雪崩效应与扩散性

输入改变 1 比特应导致输出约一半比特变化(严格雪崩准则);这是分组密码与哈希设计的检验指标,也常用于验证第三方实现的正确性。

加密与证书速查安全更新于 2026-10-13

雪崩效应是什么

雪崩效应(Avalanche Effect)指密码算法的输入发生极小改变(典型是 1 比特)时,输出应有约一半比特随之翻转。它把香农提出的扩散与混淆思想变成可度量的指标,是分组密码与哈希函数设计的检验项。严格雪崩准则(SAC)要求:翻转任意一个输入比特,每个输出比特翻转的概率都趋近 1/2。这个性质保证明文或密钥的微小差别被放大到整个输出,攻击者无法靠局部修改预测输出。

基本信息

判定标准1 比特输入变化 → 输出约 50% 比特翻转
严格雪崩准则任一输出位的翻转概率趋近 1/2
相关性质扩散(明文位影响密文位范围)、混淆(密钥与密文关系复杂化)
适用对象分组密码 AES/SM4、哈希函数 SHA-256/SM3 等
度量方式汉明距离统计、比特差分布直方图
达标线样本足够时均值接近输出位宽的一半

典型使用场景

  • 算法结构评估:自研或改造的分组密码、哈希函数是否靠轮函数与线性层把差异铺满整个状态。
  • 实现选型验证:批量跑标准测试向量,确认第三方密码库没有为提速走样。
  • 实现回归测试:把查表改成位运算之类优化后,对比差分分布,防止无意削弱扩散。
  • 教学与算法分析:展示明文的 1 比特差异如何在多轮后扩散到全部输出位。
  • 工具自检:确认哈希、签名、随机数工具的输出对输入变化足够敏感。

用哈希快速演示

用哈希快速演示
import hashlib
a = hashlib.sha256(b'0123456789abcdef').digest()   # 明文 A:16 字节
b = hashlib.sha256(b'0123456789abcdeg').digest()   # 明文 B:与 A 只差 1 比特
diff = sum(bin(x ^ y).count('1') for x, y in zip(a, b))   # 异或后数翻转位
print(diff, '/', len(a) * 8)   # 256 位中期望约 128 位不同
# 分组密码应改回同一密钥加密仅差 1 比特的两个明文块
# 单次样本波动大,判断实现质量要统计上千组再比均值与方差

观察项与读法

观察项含义正常表现异常信号
单比特翻转率多次实验的输出比特翻转比例长期均值接近 50%稳定偏离到 30% 或 70% 一类数值
翻转位分布每个输出位的翻转概率各位置大致均匀某些位几乎不变,说明未充分扩散
轮数敏感性减少轮数后的扩散变化前几轮扩散有限属正常多轮之后仍不成片扩散
实现一致性与标准向量、开源实现对比结果逐比特一致结果对不上,先怀疑实现而非算法
雪崩效应只谈比特翻转比例,不直接谈抗攻击能力。翻转率达标但密钥编排或轮数设计有缺陷的算法仍可被攻破;反过来,扩散指标一般的结构也可能具备其他安全论证。
哈希函数还能用雪崩测试检查截断实现:把输出截到 128 位后翻转率仍应接近 50%,若明显偏低,常见原因是截断时重复取了同一段字节。

易错点

  • 用单次样本下结论:样本量不足时翻转率波动可达数十个百分点,容易误判实现有缺陷。
  • 把雪崩良好当作安全证明:它只是必要条件,抗差分与线性分析要靠足够的轮数与完整设计。
  • 把统计循环写成逐条打印:验证需要大量样本,应批量计算后只输出均值与方差。
  • 拿哈希当密钥派生函数:输出分布好不等于派生安全,慢哈希与域分离缺一不可。

数据来源与参考

  • FIPS 180-4(哈希函数性质)
  • FIPS 197(AES 设计目标)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌