分组密码
将一个明文分组作为整体加密并且通常得到的是与明文等长的密文分组(一般为 64 位或 128 位)
与流密码一样,分组密码也需要共享一个对称加密密钥。
- 功能:提供数据保密性,构造伪随机数生成器、序列密码、认证码、哈希函数
- 分类:分为对称分组密码、非对称分组密码,通常指对称分组密码
- 优点:分组密码加解密速度快、安全性好,有很多密码芯片支持
将明文编码后划分成若干固定长度,每一组使用密钥进行加密
要求
- 分组长度要足够大:太小难以抵御选择明文攻击
- 密钥量要足够大:太小可以通过穷举破解
- 密码变换足够复杂:除去穷举法不应该有其他有效方法
- 加密解密运算简单:便于软硬件实现、性能好
- 无数据扩展或压缩
设计思想
代换
每个明文元素或元素组被唯一地替换为相应的密文元素或元素组
替换内容,不替换顺序,类似于代换密码
置换
明文元素的序列被替换位该序列的一个置换,但没有元素的添加、删除、替换,只改变顺序,类似于置换密码
置换不能改变单个字符或置换块上的统计特性
扩散
明文的每一比特的变化应该尽可能多地影响到输出密文序列的变化,以便隐蔽明文的统计特性(雪崩效应)
尽可能使明文和密文之间的统计关系变得复杂,使得铭文的统计特征消散在密文里
常用的方法是让每一位密文尽可能多地被明文影响
混乱
在加解密变换过程中,明文、密钥以及密文之间的关系尽可能地复杂化,以防密码破译者采用解析法进行破译攻击,从而减少推测密钥的可能性
混乱应该是可逆的,分组密码算法应有复杂的非线性因素
使用简单的代替算法几乎无法增加混淆
乘积密码
依次使用两个或两个以上的基本密码,所得结果的密码强度将强于所有单个密码的强度。
通过混合使用扩散和混乱两种基本密码操作的组合变换,产生比各自单独使用更强大的密码系统。
SPN
使用多重 S 变换和 P 变换组合成的变换网络,是乘积密码的一种。基本操作是 S 变换(代换,S 盒)和 P 变换(置换,P 盒)
S 盒负责实现混乱、P 盒负责实现扩散
SPN 具有雪崩效应,输入的微小变化会导致输出的巨大变化
分组密码基本特点
- 分组长度: 负责抵御选择明文攻击
- 密钥长度: 抵御穷举攻击
- 子密钥生成算法
迭代分组算法的重要组成部分,从初始(种子)密钥产生格伦迭代要使用的子密钥算法- 需要简单、快速生成子密钥
- 种子密钥的所有比特对每个子密钥比特的影响大致相同
- 没有弱密钥,或弱密钥容易确定
- 轮函数 F
分组密码的核心,是分组密码中单轮加解密函数- 非线性
- 可逆性
- 雪崩效应
- 迭代轮数
一般而言,迭代轮数越高,越难以破解。过高的迭代轮数会使加解密性能下降,实际安全性增强却不明显。
决定迭代轮数的准则:密码分析的难度大于简单穷举搜索攻击的难度
Feistel 密码(费斯妥密码)
长度为 位的分组密码,共有 种不同的明文分组,不同变换的个数为 个,且由于加密是可逆的,因此明文分组和密文分组一一对应,称为可逆变换或非奇异变换
对于可以生成最大数量的加密映射映射明文分组的密码,称为理想分组密码
当 很小的时候,可以很容易通过统计的方法进行批结,但这个脆弱性与替代密码无关,是因为分组密码规模太小
密码结构
明文共 位,被平均分为 和 两部分
从密钥 可以计算出子密钥 ,子密钥与密钥之间互不相同
每轮操作都使用子密钥进行替代和置换操作,并重复多次得到最终密码
加密 | 解密 |
---|---|
费斯妥密码的结构可见下图,这里有一个很重要的的特点可以发现:无论F函数如何,费斯妥密码都是可逆的!
由 联立可得 ,移项可得 ,也即无论 函数如何,费斯妥密码都可逆(可以稍微改动加密程序实现解密程序)
特征
- 分组长度:分组长度越高,安全性越高,但是会降低加解密速度。通常使用 64 位
- 密钥长度:密钥越长,安全性越高,但会降低加解密的速度。通常使用 128 位
- 迭代轮数:单论不能取得很好的安全性,而多轮可以。通常迭代 16 轮
- 子密钥产生算法:子密钥产生越复杂,分析越难
- 轮函数 F:论函数越复杂,抗攻击能力越强。轮函数不要求可逆
- 快速加解密:为了避免硬件实现麻烦,加密算法很多使用软件实现,因此运算速度很重要
- 简化分析难度:算法本身简洁更容易分析脆弱性
DES (Data Encryption Standard)
采用 位分组长度和 位密钥长度
将 位输入经过一系列变换称为 位的输出,解密和加密使用相同的密钥(属于对称加密)
DES 本身使用的是Feistel密码结构
加密算法
- 输入:
- 位明文
- 位密钥( 位密钥内容 + 位校验)
- 输出:
- 位密文
- 加密步骤
- 初始置换:进行初始化置换操作,重新排列明文
- 分组: 将 位的数据平均分成 位的两部分
- 生成子密钥
- 对原 位密钥进行置换 1,得到 位结果
- 将结果分为相同的两部分,分别 位
- 循环 次得到 个子密钥
- 对两部分分别进行循环左移(移动位数由轮数决定)
- 拼接两部分并进行置换 2,得到一个 位子密钥
- 16 轮函数操作:
- 左部分为原本的右部分
- 右部分为右部分与子密钥传入函数运算,并与左部分异或
- 函数:
- 将输入进行拓展置换
- 置换结果与子密钥异或
- 异或结果进行普通置换
- 函数:
- 将最后的两部分互换后拼接
- IP 逆置换:IP 置换的逆置换
解密算法
改变子密钥使用顺序,以及 IP 置换与逆置换
DES代码实现
更详细的 DES 实现细节可见DES 算法实现
DES 差分攻击
TODO: 待补全
DES 的互补性
选择明文攻击下,有 由互补性有
在穷举搜索密钥时,如果输出密文是 ,则加密密钥就是所用的密钥;若输出密钥是 , 则可知加密密钥是当前密钥的补。这样一次加密尝试,可以得知两个密钥是否是真正的密钥
互补性会使DES在选择明文攻击下所需工作量减半
多重 DES
由于 DES 本身不构成一个群,因此可以使用多重 DES 的方式来增加密码强度
双重 DES
使用密钥 加密明文得到密文 ,再次使用密钥 对 进行加密可得到密文 ,这种将明文通过两次加密得到密文 的过程称为双重 DES
一般而言, 和 的密钥空间都为 ,那么总的双重 DES 密钥空间应该为 ,但是实际上并非如此!
对于 ,有
只需要枚举所有的 加密 并存储结果,并枚举所有的 解密 并存储结果,对比两者结果的相同值,那么对应的 和 就是实际的密钥。
二重DES并未将密钥长度提高到 比特,而只有 比特
三重 DES
由于双重 DES 对安全性的提高并不显著,因此有了三重 DES
三重 DES 并非直接进行三次 DES 加密,而是使用两个或三个密钥进行加密、解密、加密过程(这里主要是为了实际使用时可以充分理由设备)
- 优点:
- 密钥长度增加到112或168位,克服了DES面对的穷举攻击
- 增强了算法复杂度,提高了安全性
- 由于DES已大规模应用,升级到3DES比更新算法成本小很多
- DES比其他任何加密算法受到分析的时间都长的多,抗分析能力也更强
- 缺点:
- 3DES加解密速度较慢
- 虽然密钥长度增加了,但明文长度没变,与密钥长度的增长不匹配
雪崩效应
明文和密钥的微笑改变会对密文产生巨大的影响
设计时应该遵循严格雪崩效应准则(SAC):对于所有的 和 ,它要求若 盒的输入的任意一位 发生变化,输出的任意一位 发生变化的可能性为
性质
攻击方式 | 效果 |
---|---|
针对算法攻击 | S 盒目前没有致命弱点 |
计时攻击 | DES 目前能很好抵抗计时攻击 |
流密码
流密码中每个加密数据流的一位或一个字节
Vigenere 密码和 Vernam 属于古典流密码的经典例子
位流发生器是一个由密钥控制的算法,必需产生在密码学意义上是强壮的位流,两个用户只需共享生成密钥就可以各自产生密钥流