进阶秘密钥匙系统
3-1 密码系统的安全性
· 破解因素:『计算上的安全』(Computationally Secure)
· 密码系统的抗拒能力:
o 算法的复杂度:
§ 混淆 (Confusion):密文与钥匙之间的复杂度。
§ 扩散 (Diffusion):明文与密文之间的复杂度。
o 分布式暴力攻击法:
· 『增加钥匙长度』
o 提高破解的困难度。
o 可能导致传输效益降低。
o 美国出口管制。
3-2 秘密钥匙系统之摘要
· 基本模型 (Festel 模型)
· 相关参数:
o 区块大小:64 bits
o 初始排列
o 排列格式:交叉排列
o S-替代盒
o 钥匙长度
o 子钥匙数量
o 重复回合次数
o 输出转换
3-3 Triple DES 密码系统
· 2 把钥匙:56 bits * 2
o 加密:C = EK1[DK2[EK1[P]]]
o 解密:P = DK1[EK2[DK1[C]]]
o 钥匙:K = K1 || K2 (排列组合)
· 3 把钥匙:56 bits *3
o 加密:C = EK3[DK2[EK1[P]]]
o 解密:P = DK1[EK2[DK3[C]]]
o 钥匙:K = K1 || K2 || K3
3-4 IDEA (International Data Encryption Algorithm)
密码系统
· 特点:
o 区块长度:64 bits
o 初始转换:分为 4 个群组,每群组 16 bits (DES 为 2 群组)。
o 钥匙长度:128 bits (DES 为 56 bits)。
o 子钥匙:52 把/16 bits (DES 16 把/48 bits)
o 重复次数:8 次,每次 6 把子钥匙 (DES 16 次/1 把)
o S-替代盒:3 种运算器。
o 输出转换:类似 S-替代盒,使用 4 把子钥匙。
3-4-1 加密运作程序
3-5-1 IDEA 子钥匙产生
· 128 bits 母钥匙分为 8 个群组,每组 16 bits。
· 取出 8 把子钥匙。
· 左旋 25 bits。
· 再取出 8 把子钥匙,再左旋 25 bits。
3-5-2 编码器的设计
· XOR 运算子:位之间的 XOR 运算。
· 『216 余数』加法运算子:加法取 216 的余数。
· 『:加法取 216 +1 的余数。
· 输出转换器
3-5-3 IDEA 操作模式
· 与 DES 系统相同:
· 电子密码书模式
· 密文区段反馈模式
· J-位密文反馈模式
· J-位输出反馈模式
3-6 RC5 密码系统
· RSA Data Security Inc. 公司主要产品。
· 允许使用者自行定义:
o 钥匙长度
o 区段大小
o 重复编码次数
3-6-1 RC5 参数
· 由三个参数所描述,如 RC5-w/r/b 表示:
· w :表示每字的位数 (两个字符),如区块长度为 64 bits,则 w = 32。
· r :编码回合次数,由 0, 1, ..., 255。越高混淆程度越高。
· b :钥匙长度,以字节表示。
· 譬如:RC5-32/12/16,则表示区块为 64 bits、编码为 12 次、钥匙长度为 128 bits。
3-6-2 编码程序
· 子钥匙数目:t = 2r +2,S[0], S[1], ..., s[t-1]。
· 钥匙长度:w (如 32 bits)
· 初始排列与每一回合都使用到 2 把钥匙。
· 五种运算子:
o 加法运算子
o 减法运算子
o XOR 运算子
o 左移旋转运算子
o 右移旋转运算子
· 加密运算程序:
LE0 = A + S[0]
RE0 = B + S[1]
For n = 1 to r do
LEn = ((LEn-1 ⊕ REn-1) <<< REn-1 ) + S[2 n ]
REn = ((REn-1 ⊕ LEn ) <<< LEn ) + S[2 n +1];
· 解密运算程序:
for n = r down to 1 do
RDn-1 = (((RDn – S[2n+1]) >>> LDn) ⊕ LDn)
LDn-1 = (((LDn – S[2n]) >>> RDn-1) ⊕ RDn-1);
B = RD0 – S[1];
A = LD0 – S[0];
3-7 RC5 操作模式
· RC5 区块加密:电子密码书模式 (DES-ECB 模式)。
· RC5-CBC :密文区块串接模式 (DES-CBC 模式)。
· RC5-CBC-pad:可处理任意长度的明文,不足 2w 部份以空白长度表示,并将其补满。
· RC5-CTS:密文盗用 (Cipher Text Stealing) 模式。
3-7-1 RC5-CTS 模式
· 可处理任意长度的明文,并且明文与密文长度相同。
· 加密程序:
1. 利用传统的 CBC 技巧,对前面(N-2)个区段加密。
2. 将 PN-1 与前一回合所产生的密文区段 CN-2 执行 XOR 运算,所产生的结果为 XN-1。
3. 将 XN-1 加密编码成为 YN-1。
4. 选取 YN-1 的前面 L 个位成为 CN,并舍弃其它未选入的位。
5. 将讯息最后部分(PN)以 0 补足区块的长度(2w - L),再与前一回合所产生的密文区块 YN-1 执行 XOR 运算,所产生的结果为 XN。
6. 将 XN 加密编码成为 CN-1。
7. 则所生的密文为 C1 || C2 || … || CN-2 || CN-1 || CN。
· 解密程序:
1. 利用传统的 CBC 技巧,对前面(N-2)个区块解密。
2. 将 CN-1 解密编码后成为 YN-1。
3. YN-1 与前一回合的 CN-2 执行 XOR 运算后成为 XN-1。
4. 选取 XN-1 前面的 L 个位成为 PN,并抛弃未选取部分。
5. 将密文最后部分(CN)以 0 补足区块的长度(2w - L),再经过解密编码成为 YN。
6. 将 YN 与前一回的密文区块 CN-1 执行 XOR 运算,所产生的结果为 PN-1。
7. 则所解密出来的明文为 P1 || P2 || … || PN-2 || PN-1 || PN。
3-8 进阶加密标准
(Advanced Encryption Standard, AES)
· 美国 NIST 标准。
· 采用 Rijndael 算法
· 合乎条件:
o 加密编码法必须是非保密的。
o 算法必须是公开的。
o 加密编码法必须是自由使用的。
o 至少 128 bits 的加密区块。
o 钥匙长度做少需要 128, 192, 256 个位。
· Rijndael 算法特性:
o 区块长度:128, 192, 256 个位。
o 钥匙长度:AES-128、AES-192、AES-256 密码系统。
o 编码算法:『反复区段编码』(Iterated Block Cipher, IBC)
3-9-1 AES 算法参数
· 明文区段数目 (Nb) :32 bits 加密区段的数目。
· 钥匙区段数目 (Nk) :32 bits 钥匙区段的数目。
· 重复次数 (Nr) :加密/解密编码的次数。
Nr = 6 + max (Nb, Nr)
· 标准规范:
o AES-128
o AES-192
o AES-256
o 明文及密文长度:128 bits
3-9-2 AES-128 范例
· 明文区块:128 bits,Nb = 4。
· 钥匙长度:128 bits,Nk = 4。
· 重复次数:Nr = 6 + max (Nb, Nr) = 10。
· AES-128 加密算法架构
3-9-3 运作程序
· 每区段为 8 bits
· 输入数组 in
· 状态数组 (State) S
· 输出数组 out
3-10 AES 加密编码
· 回合钥匙加法运算:AddRoundKey()
· 字节取代:SubBytes()
· 列移位运算:ShiftRows()
· 混合行运算:MixColumns()
Cipher (byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)]) /* in 为输入数组、out = 输出数组、w = 钥匙字符数组 */ Begin Byte state[4, Nb] /* 明文数组复制到状态数组上 */ state = in /* 第 0 回合编码 */ AddRoundKey(state, w[0, Nb-1]) /* 第 1 到 Nr – 1 回合编码 */ for round = 1 step 1 to Nr-1 SubBytes(state) ShiftRows(state) MixColumns(state) AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) end for /* 第 Nr 回合编码 */ SubBytes(state) ShiftRows(state) AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) /* 密文数组输出 */ out = state end |
3-11 AES 钥匙扩充
· 钥匙字符单位:W[i], 32 bits
· 钥匙字符数量:Nb * (Nr + 1)
· AES-128 需要:44 个钥匙字符
· 每一回合使用 4 个字符
KeyExpansion(byte key[4*Nk], word w[Nb * (Nr+1)], Nk) /* 主钥匙输入 key[],子钥匙字符输出 w[],钥匙字符数量输入 Nr */ /*Nk = 4(AES-128),Nk = 6(AES-192),Nk = 8(AES-256)*/ (1)begin (2) word temp (3) i = 0 (4) while (i < Nk) /*将主钥匙填入钥匙区块,第 0 回合使用 */ (5) w[i] = word(key[4*i], key[4*i + 1], key[4*i +2], key[4*i + 3]) (6) i = i +1 (7) end while (8) i = Nk (9) while (i < Nb * (Nr + 1)) /* 演算第 1 到 Nr 回合所需钥匙 */ (10) temp = w[i –1] (11) if (i mod Nk = 0) /* 子钥匙区块周期的开始,如图 3-18 所示 */ (19) temp = SubWord(RotWord(temp)) XOR Rcon[i/Nk] (19) else if (Nk > 6 and I mod Nk = 4) /* 仅 AES-256 适用 */ (19) temp = SubWord(temp) (19) end if (19) w[I] = w[I – Nk] XOR temp (19) I = I +1 (18) End while (19)end |
3-12 AES 解密算法
· InvShiftRows():ShiftRows() 的反函数
· InvSubBytes():SubBytes() 的反函数
· InvMixColumns():MixColumns() 的反函数
· AddRoundKey()
InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb *(Nr+1)]) Begin byte state[4, Nb] /* 明文数组填入状态数组中 */ state = in /* 第 0 回合编码 */ AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) /* 第 1 到 Nr -1 回合编码 */ for round = Nr-1 step –1 downto 1 InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w[round*Nb, (round+1)*Nb – 1]) InvMixColumns(state) end for /* 第 Nr 回合编码 */ InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w[0, Nb-1]) /* 密文区块输出 */ out = state End begin |
3-11 其它密码系统
· CAST-128 加密算法:
o 典型 Feistel 架构
o RFC 2144 标准
o 明文/密文区块:64 bits
o 钥匙长度: 40 ~ 128 bits
o 编码处理:16 回合
· Blowfish 加密算法:
o 明文/密文区块:64 bits
o 钥匙长度:32 ~ 448 bits
· RC2 加密算法
o 明文/密文区块:64 bits
o 钥匙长度:8 ~ 1024 bits
o 适合 16 bits 微处理机处理
· RC4 加密算法
o 串流加密算法
o 钥匙长度:8 ~ 1024 bits