RC5加密算法的密钥扩展算法详解
RC5是一种由Ronald Rivest设计的对称分组密码算法,以其简单性、灵活性和高性能著称。其中,密钥扩展算法是RC5的关键组成部分,它负责将用户提供的可变长度密钥(0到255字节)扩展为一个足够大的轮密钥数组,用于算法的多轮加密和解密过程。本题目将详细讲解RC5密钥扩展算法的每一步。
1. 算法参数与预备知识
RC5算法通常表示为RC5-w/r/b,其中:
- w:字长(以比特为单位),表示算法处理的基本数据单元大小,常见值为16、32、64。一次加密两个w比特的字。
- r:轮数,建议值如12、16、20。
- b:密钥字节长度(0 ≤ b ≤ 255)。
密钥扩展的目标是生成一个大小为 t = 2(r+1) 的轮密钥数组 S[0, 1, ..., t-1],每个元素是一个w比特的字。该过程依赖于两个幻常数:
- P_w:基于自然常数e和黄金比例φ导出的奇数,具体为
P_w = Odd((e-2) * 2^w),其中Odd表示取最接近的奇数。例如,对于w=32,P_w = 0xB7E15163。 - Q_w:
Q_w = Odd((φ-1) * 2^w),对于w=32,Q_w = 0x9E3779B9。
这些常数提供初始的随机性,与密钥混合。
2. 密钥转换:从字节到字
用户密钥K是一个长度为b字节的数组K[0], K[1], ..., K[b-1]。首先,需要将其转换为一个w比特字的数组L。
- 计算
c = ceil(8b / w),即密钥K可以组成的w比特字的数量。例如,若b=16字节(128比特),w=32比特,则c = ceil(128/32) = 4。 - 初始化数组
L[0, 1, ..., c-1]为0。 - 按小端顺序(即最低有效字节优先)将密钥字节填充到L中:对于每个密钥字节
K[i],它被放入L[i * 8 / w]字的相应字节位置。具体操作是:L[i * 8 / w] = (L[i * 8 / w] << 8) + K[i]。这确保了密钥的所有比特都被正确加载到L数组中。
3. 初始化轮密钥数组S
轮密钥数组S的长度为t = 2(r+1)。首先用线性同余生成器初始化:
S[0] = P_w- 对于i从1到t-1:
S[i] = S[i-1] + Q_w
这一步产生了一个看似随机的初始序列S,但它与用户密钥无关,后续步骤将密钥混合进去。
4. 主混合循环
这是密钥扩展的核心,目标是将用户密钥(存储在L中)与初始轮密钥S充分混合。通过三次执行max(t, c)次循环,确保S的每个字都依赖于密钥的所有比特。
- 初始化三个变量:
i = 0,j = 0,A = 0,B = 0。 - 循环执行
3 * max(t, c)次:S[i] = (S[i] + A + B) <<< 3。这里<<<表示循环左移,移动位数固定为3(这是设计选择,增加非线性)。A = S[i]。L[j] = (L[j] + A + B) <<< (A + B)。移动位数依赖于A+B(模w),增加了可变性。B = L[j]。- 更新索引:
i = (i + 1) mod t,j = (j + 1) mod c。
这个循环确保了S和L之间的双向混合:S的每个字被更新时,会结合当前A和B(来自前一步的S和L),然后更新A,进而影响L的更新;L的更新又改变B,反过来影响下一轮S的更新。循环左移操作破坏了加法的线性,增强了扩散。执行三次max(t, c)次循环是经验性的,确保了充分混合。
5. 输出与使用
最终,数组S就是扩展后的轮密钥,用于RC5的加密和解密。在加密时,轮密钥S[0]和S[1]用于预处理,之后每轮使用两个轮密钥(例如第1轮用S[2]和S[3])。解密过程使用相同的轮密钥,但顺序相反。
总结:RC5的密钥扩展算法通过将用户密钥转换为字数组,初始化一个基于幻常数的数组,然后通过主混合循环将两者充分结合,生成强伪随机的轮密钥。其设计简单,但通过循环移位和可变移位位数提供了良好的非线性,确保了密钥的扩散和算法的安全性。理解此过程有助于深入掌握RC5的整体工作原理。