1. 背景与历史
RC5是Ron Rivest开发的对称密钥块加密算法。RC5的主要特性是很快,只是用基本的计算机运算(加、异或、移位等),轮数可变,密钥位数可变,从而大大增加灵活性。需要不同安全性的应用程序可以相应设置这些值。RC5的另一个重要特性是执行所需的内存更少。
2.RC5工作的基本原理
RC5的字长(即输入明文块的长度)、轮数和密钥8位字节数都是可变的。一旦确认之后,这些值在执行特定的加密算法时保持不变。这些变量在执行特定的RC5实例之前是可变的,可以从取值范围中选择。而DES的块长只能是64位,密钥长度只能是56位;IDEA的块长只能是64位,密钥长度只能是128位。下表列出了RC5一些参数的取值范围:
从表中可以得到下列结论:
(1)明文块长可以是32、64或者128位(使用2个字)
(2)密钥长度为0~2040位(指定了8位密钥的取值)
RC5的输出是密文,与输入明文具有相同的参数。由于RC5算法的三个参数可以改变数值,因此RC5算法的特定实例记作RC5-w/r/b,其中w为字长(位),r为轮数,b为密钥的8位字节数。这样,RC5-32/16/16表示为RC5的块长为64位(注:RC5使用两个字块)、16轮加密和16字节密钥。Ron Rivest推荐的最低安全版本为RC5-32/16/16。
2.1 操作原理
由于使用上述记法,RC5初看起来比较复杂。首先介绍RC5的工作原理,为了便于理解RC5算法,假设输入明文块的长度为64位,其他块长的操作原理是一样的。
在一次性初始操作中,输入明文块分成两个32位块A和B,前两个子密钥(稍后会介绍如何生成)S[0]和S[1]分别加进A和B,分别产生C和D,表示一次性操作结束。
然后开始各轮,每一轮完成系列操作:
(1)位异或运算;
(2)循环左移;
(3)对C和D增加下一个子密钥,先是加法运算,然后将结果用
2
w
2^w
2w求模(由于这里w=32,因此为
2
32
2^{32}
232)。
RC5 的工作原理,如下图所示:
从上图可以看出,初始操作有两步,然后是几轮操作,轮数可以取0~255。也可以从中看出,一个块的输出是另一个块的输入,是整个逻辑很难破译。
2.2 一次性初始操作
首先看一次性初始操作,如图1-2所示:
从上图可以看出,RC5中的一次性初始操作包括两个简单步骤:第一,输入明文分为两个等长的A和B;第二,第一个子密钥S[0]与A相加,第二个子密钥S[1]与B相加。
注:这些操作用
2
32
2^{32}
232求模,分别得到C和D。
2.3 每轮的细节
下面介绍每一轮的细节,后面每一轮都是一样的。
第一步:C和D异或
每一轮的第一步为C和D异或运算,得到E。
第二步:循环左移E
现在将E循环左移D位
第三步:将E与下一个子密钥相加
这一步要将E与下一个子密钥相加。第一轮为S[2],第i轮为S[2i],这个运算结果为F。
注:第4~ 6的运算与第1~ 3步相同,只是第4~ 6步的输入与第1~ 3步不同。
第四步:D和F异或
每一轮的第一步为D和F异或运算,得到G。
第五步:循环左移G
现在将G循环左移F位
第六步:将G与下一个子密钥相加
这一步要将G与下一个子密钥相加。第一轮为S[3],第i轮为S[2i+1],这个运算结果为H。
第七步:其他任务
这一步要检查所有的各轮是否结束,为此要实现如下步骤:(1)将i加1;(2)检查是否i<r。
2.4 子密钥生成
RC5子密钥的生成只有两步:
(1)第一步,生成子密钥(标为S[0],S[1],…)。
(2)原先的密钥称为L,第二步,子密钥(标为S[0],S[1],…)与原密钥相应的部分(L[0],L[1],…)混合。
下面将介绍这两个步骤:
第一步:子密钥生成
这一步使用两个常量P和Q。生成的子密钥数组称为S,第一个子密钥为S[0]用P值初始化。
每个后续子密钥(S[1],S[2],…)根据前面的子密钥和常量Q求出,用
2
32
2^{32}
232求模。这个过程要进行2(r+1)-1次,其中r位轮数。下图显示了子密钥生成的数学形式:
下图显示了子密钥生成的过程:
第二步:子密钥混合
子密钥混合阶段将子密钥S[],S[],…与原密钥L[],L[],…混合。其数学形式如下图所示:
如上图所示,首先初始化i,j,A和B;其次将子密钥与A和B相加,并左移3位,赋给A和该子密钥,将原密钥与A和B相加,并左移A加B位,赋给B和该原密钥;最后,将i加1,并用2(r+1)求模,将j加1,并用c求模,循环3×n次结束。
注:c是原密钥中最后一个子密钥部分,<<<表示循环左移。
3.RC5的模式
如下表所示的算法模式来实现RC5,可以获得更好的性能,这些定义在2040中。