2010-5-14 1
第四章 分组密码
一、分组密码概述
二、分组密码运行模式
三,DES
四,AES
五、分组密码的分析
2010-5-14 2
四,AES
2010-5-14 3
AES提出
? 1997年 1月, 美国 NIST向全世界密码学界
发出征集 21世纪高级加密标准 ( AES—
— Advanced Encryption Standard) 算法
的公告, 并成立了 AES标准工作研究室,
1997年 4月 15日的例会制定了对 AES的评
估标准 。
?
2010-5-14 4
AES的要求
( 1) AES是公开的;
( 2) AES为单钥体制分组密码;
( 3) AES的密钥长度可变, 可按需要增大;
( 4) AES适于用软件和硬件实现;
( 5) AES可以自由地使用, 或按符合美国国家
标准 ( ANST) 策略的条件使用;
2010-5-14 5
算法衡量条件
? 满足以上要求的 AES算法,需按下述条
件判断优劣
? a,安全性
? b,计算 效率
? c,内 存要求
? d,使用 简便性
? e,灵活性。
2010-5-14 6
AES的评审
? 1998年 4月 15日全面征集 AES算法的工作结束 。 1998年 8
月 20日举行了首届 AES讨论会, 对涉及 14个国家的密码
学家所提出的候选 AES算法进行了评估和测试, 初选并
公布了 15个被选方案, 供大家公开讨论 。
CAST-256,RC-6,CRYPTON-128,DEAL-128,
FROG,DFC,LOKI-97,MAGENTA,
MARS,HPC,RIJNDAEL,SAFER+,
SERPENT,E-2,TWOFISH。
? 这些算法设计思想新颖, 技术水平先进, 算法的强度都
超过 3-DES,实现速度快于 3-DES。
2010-5-14 7
AES的评审
? 1999年 8月 9日 NIST宣布第二轮筛选出的 5个
候选算法为:
MARS(C.Burwick等,IBM),
RC6TM( R,Rivest等,RSA Lab.),
RIJNDEAL(J,Daemen,比 ),
SERPENT(R,Anderson等,英、以、挪威 ),
TWOFISH(B,Schiener)。
? 2000年 10月 2日,NIST宣布 Rijndael作为新的
AES
2010-5-14 8
AES算法设计思想
? 抵抗所有已知的攻击;
? 在多个平台上速度快,编码紧凑;
? 设计简单。
? Rijndael没有采用 Feistel结构,轮函数由
3个不同的可逆均匀变换构成的,称为 3
个层
? 均匀变换是指状态的每个 bit都用类似的
方法处理
2010-5-14 9
轮函数的 3层
? 线性混合层
? 确保多轮之上的高度扩散;
? 非线性层
? 将具有最优的, 最坏情况非线性特性, 的 S
盒并行使用;
? 密钥加层
? 单轮子密钥简单的异或到中间状态上,实现
一次性掩盖。
2010-5-14 10
算法说明
? 分组和密钥长度可变,各自可独立指定为 128、
192,256比特。
? 状态
? 算法中间的结果也需要分组,称之为状态,状态可
以用以字节为元素的矩阵阵列表示,该阵列有 4行,
列数 Nb为分组长度除 32
? 种子密钥
? 以字节为元素的矩阵阵列描述,阵列为 4行,列数
Nk为密钥长度除 32
2010-5-14 11
算法说明
? 算法的输入、输出和种子密钥可看成字
节组成的一维数组。
? 下标范围
? 输入输出,0- 4Nb-1,
? 种子密钥,0- 4Nk-1
2010-5-14 12
Nb=6和 Nk=4的状态密钥阵列
按此顺序放入和读出 按此顺序放入
2010-5-14 13
分组和阵列中元素对应关系
? 分组下标 n
? 阵列位置 (i,j)
? i=n mod 4,j=[n/4];n=i+4j
? 轮数 Nr与 Nb和 Nk对应关系
Nb=4 Nb=6 Nb=8
Nk=4 10 12 14
Nk=6 12 12 14
Nk=8 14 14 14
2010-5-14 14
轮函数
? 字节代换
? 行移位
? 列混合
? 密钥加
2010-5-14 15
字节代换
? 非线性代换,独立地对状态的每个字节
进行,并且代换表 (S盒 )可逆,记为
ByteSub(State),分两步
(1) 将字节作为 GF(28)上的元素映射到自
己的逆元
(2) 将字节做如下的 GF(2)上变换
2010-5-14 16
字节代换
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
0
1
1
0
0
0
1
1
11111000
01111100
00111110
00011111
10001111
11000111
11100011
11110001
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
x
x
x
x
x
x
x
x
y
y
y
y
y
y
y
y
2010-5-14 17
行移位
? 将状态阵列的各行进行循环移位,不同
行的移位量不同
? 0行:不动
? 1行:循环左移 C1字节
? 2行:循环左移 C2字节
? 3行:循环左移 C3字节
? 记为,ShiftRow(State)
2010-5-14 18
行移位
? 移位量与分组长度的关系
Nb C1 C2 C3
4 1 2 3
6 1 2 3
8 1 3 4
2010-5-14 19
列混合
? 将每列视为 GF(28)上多项式,与固定的
多项式 c(x)进行模 x4+1乘法,要求 c(x)
模 x4+1可逆。
? 表示为 MixColumn(State)
'02''01''01''03')( 23 ???? xxxxc
2010-5-14 20
密钥加
? 轮密钥与状态进行逐比特异或。
? 轮密钥由种子密钥通过密钥编排算法得
到
? 轮密钥长度与分组密钥长度相同
? 表示为
AddRoundKey(State,RoundKey)
2010-5-14 21
轮函数的伪 C代码
Round(State,RoundKey)
{ ByteSub(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,Roundkey);
}
2010-5-14 22
结尾轮的轮函数
Round(State,RoundKey)
{ ByteSub(State);
ShiftRow(State);
AddRoundKey(State,Roundkey);
}
第四章 分组密码
一、分组密码概述
二、分组密码运行模式
三,DES
四,AES
五、分组密码的分析
2010-5-14 2
四,AES
2010-5-14 3
AES提出
? 1997年 1月, 美国 NIST向全世界密码学界
发出征集 21世纪高级加密标准 ( AES—
— Advanced Encryption Standard) 算法
的公告, 并成立了 AES标准工作研究室,
1997年 4月 15日的例会制定了对 AES的评
估标准 。
?
2010-5-14 4
AES的要求
( 1) AES是公开的;
( 2) AES为单钥体制分组密码;
( 3) AES的密钥长度可变, 可按需要增大;
( 4) AES适于用软件和硬件实现;
( 5) AES可以自由地使用, 或按符合美国国家
标准 ( ANST) 策略的条件使用;
2010-5-14 5
算法衡量条件
? 满足以上要求的 AES算法,需按下述条
件判断优劣
? a,安全性
? b,计算 效率
? c,内 存要求
? d,使用 简便性
? e,灵活性。
2010-5-14 6
AES的评审
? 1998年 4月 15日全面征集 AES算法的工作结束 。 1998年 8
月 20日举行了首届 AES讨论会, 对涉及 14个国家的密码
学家所提出的候选 AES算法进行了评估和测试, 初选并
公布了 15个被选方案, 供大家公开讨论 。
CAST-256,RC-6,CRYPTON-128,DEAL-128,
FROG,DFC,LOKI-97,MAGENTA,
MARS,HPC,RIJNDAEL,SAFER+,
SERPENT,E-2,TWOFISH。
? 这些算法设计思想新颖, 技术水平先进, 算法的强度都
超过 3-DES,实现速度快于 3-DES。
2010-5-14 7
AES的评审
? 1999年 8月 9日 NIST宣布第二轮筛选出的 5个
候选算法为:
MARS(C.Burwick等,IBM),
RC6TM( R,Rivest等,RSA Lab.),
RIJNDEAL(J,Daemen,比 ),
SERPENT(R,Anderson等,英、以、挪威 ),
TWOFISH(B,Schiener)。
? 2000年 10月 2日,NIST宣布 Rijndael作为新的
AES
2010-5-14 8
AES算法设计思想
? 抵抗所有已知的攻击;
? 在多个平台上速度快,编码紧凑;
? 设计简单。
? Rijndael没有采用 Feistel结构,轮函数由
3个不同的可逆均匀变换构成的,称为 3
个层
? 均匀变换是指状态的每个 bit都用类似的
方法处理
2010-5-14 9
轮函数的 3层
? 线性混合层
? 确保多轮之上的高度扩散;
? 非线性层
? 将具有最优的, 最坏情况非线性特性, 的 S
盒并行使用;
? 密钥加层
? 单轮子密钥简单的异或到中间状态上,实现
一次性掩盖。
2010-5-14 10
算法说明
? 分组和密钥长度可变,各自可独立指定为 128、
192,256比特。
? 状态
? 算法中间的结果也需要分组,称之为状态,状态可
以用以字节为元素的矩阵阵列表示,该阵列有 4行,
列数 Nb为分组长度除 32
? 种子密钥
? 以字节为元素的矩阵阵列描述,阵列为 4行,列数
Nk为密钥长度除 32
2010-5-14 11
算法说明
? 算法的输入、输出和种子密钥可看成字
节组成的一维数组。
? 下标范围
? 输入输出,0- 4Nb-1,
? 种子密钥,0- 4Nk-1
2010-5-14 12
Nb=6和 Nk=4的状态密钥阵列
按此顺序放入和读出 按此顺序放入
2010-5-14 13
分组和阵列中元素对应关系
? 分组下标 n
? 阵列位置 (i,j)
? i=n mod 4,j=[n/4];n=i+4j
? 轮数 Nr与 Nb和 Nk对应关系
Nb=4 Nb=6 Nb=8
Nk=4 10 12 14
Nk=6 12 12 14
Nk=8 14 14 14
2010-5-14 14
轮函数
? 字节代换
? 行移位
? 列混合
? 密钥加
2010-5-14 15
字节代换
? 非线性代换,独立地对状态的每个字节
进行,并且代换表 (S盒 )可逆,记为
ByteSub(State),分两步
(1) 将字节作为 GF(28)上的元素映射到自
己的逆元
(2) 将字节做如下的 GF(2)上变换
2010-5-14 16
字节代换
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
0
1
1
0
0
0
1
1
11111000
01111100
00111110
00011111
10001111
11000111
11100011
11110001
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
x
x
x
x
x
x
x
x
y
y
y
y
y
y
y
y
2010-5-14 17
行移位
? 将状态阵列的各行进行循环移位,不同
行的移位量不同
? 0行:不动
? 1行:循环左移 C1字节
? 2行:循环左移 C2字节
? 3行:循环左移 C3字节
? 记为,ShiftRow(State)
2010-5-14 18
行移位
? 移位量与分组长度的关系
Nb C1 C2 C3
4 1 2 3
6 1 2 3
8 1 3 4
2010-5-14 19
列混合
? 将每列视为 GF(28)上多项式,与固定的
多项式 c(x)进行模 x4+1乘法,要求 c(x)
模 x4+1可逆。
? 表示为 MixColumn(State)
'02''01''01''03')( 23 ???? xxxxc
2010-5-14 20
密钥加
? 轮密钥与状态进行逐比特异或。
? 轮密钥由种子密钥通过密钥编排算法得
到
? 轮密钥长度与分组密钥长度相同
? 表示为
AddRoundKey(State,RoundKey)
2010-5-14 21
轮函数的伪 C代码
Round(State,RoundKey)
{ ByteSub(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,Roundkey);
}
2010-5-14 22
结尾轮的轮函数
Round(State,RoundKey)
{ ByteSub(State);
ShiftRow(State);
AddRoundKey(State,Roundkey);
}