1.15 RC2加密算法

RC2是Ron Rivest于1987年为RSA数据安全公司(RSADSI)设计的专用分组加密算法,它与RC4和RC5加密算法一起被收入RSADSI的加密工具箱BSAVE。1996年2月有人通过逆性分析,将该加密算法的细节公布在互联网上。1997年6月RSADSI正式公布了RC2加密算法,并将它提交给国际互联网工程任务组(Internet Engineering Task Force, IETF)作为国际互联网上的标准草案(Internet-Draft)进行评论。RC2加密算法是RSADSI开发的、并已提交IETF作为标准审查的电子邮件安全协议S/MIME的重要组成部分,RSADSI公布RC2加密算法是为了让IETF对它进行审查,这是对S/MIME进行标准化工作的一部分。

RC2加密算法的输入、输出分组长度为64比特,输入密钥长度可变(为1~128字节)。输入密钥经密钥扩展算法生成128字节的扩展密钥 L[0]~L[127],作为进行加、脱密运算时的层密钥。RC2加密算法以16比特的字为单位进行运算,输入的64比特明文先预置4个字R[0]~R[3],然后经两种基本运算——mix(混乱)和mash(掩乱)多层迭代生成密文,共有16层mix运算,并在第5~6层之间和第11~12层mix运算之间分别夹有一层mash运算。

密钥扩展算法是由输入密钥和π表生成128字节的层密钥的过程。π表是0~255的排列,是由π=3.14159…的各位数值决定的。π表的具体值如表1.15.1所示。

表1.15.1 π表的具体值

由表1.15.1可知,π(0)=d9, π(1)=78, …, π(ff)=ad。

t为输入密钥的字节数,s为有效密钥比特数的上界(注意:这里输入密钥长度和有效密钥长度不是一回事,有效密钥长度的比特数为min(8t, s),即穷尽搜索密钥时需要的穷尽量为min(28t,2s)。

t1=‘s/8’为s比特对应字节数的上界,s1=(s mod 8)+(‘(s+1) /8’-t1)+8,即s比特按8比特划分余下的比特数,但当s能被8整除时,s1=8。密钥扩展过程如下:

(1)将输入的t字节密钥置入L[0], …, L[t-1]。

(2)对于i=t, t+1, …,127,计算:

L[i]=π[(L[i-1]+L[i-t])mod 256]

(3)计算:

L[128-t1]=π[L[128-t1]&(2S1-1)]

式中,“&”表示按比特“与”,该运算以L[128-t1]的低位s1比特为地址码,取π表中的相应值作为新的L[128-t1]。

(4)对于i=127-t1, …,0,计算:

L[i]=π(L[i+1]⊕L[i+t1])

经过上述四步运算可得层密钥 L[0]~L[127],其中步骤(3)和(4)是为了控制有效密钥比特数不超过 s,以适应美国政府对出口密码的限制要求。当美国政府限制出口密码的密钥长度不能超过40比特时,只要将有效密钥长度的上界s设置为40即可。即使用户采用很长的密钥(可达128字节=1024比特),但实际有效密钥长度小于或等于s。这是对密码算法设置陷门的方法之一。

RC2加密算法的加密过程由mix和mash两个基本运算组成,运算以16比特为单位(称其为字)进行。层密钥 L[0]~L[127]以16比特的字作为单位,记为 K[0]~K[63],这时K[i]=L[2i]+256L[2i+1]。每层的mix用4个K[i]作为层密钥,第1层的mix用K[0]~K[3],第2层的mix用K[4]~K[7], …,第i层的mix用K[4(i-1)]~K[4(i-1)+3],16层共用64个K[i],所以K[0]~K[63]中的每个字恰好都被用一次。下面先出mix和mash的概念,然后介绍一个明文分组的加密过程。

R[i]进行mix运算由以下三步组成:

R [i]=R[i]+K[j]+(R[i-1]&R[i-2])+(R[i-1]&R[i-3])

j=j+ 1

R[i]=R[i]<<<r[i]

式中,“+”为模216加,“&”为按比特与,x<<<r[i]表示x循环左移r[i]位,r[0]~r[3]分别表示1、2、3、5。R[i]中的i进行的是模4运算,如R[-1]=R[3]。

R[i]进行mix运算,实际上就是在R[i]上加上相应的层密钥K[j],同时在R[i-1]的指示下选取 R[i-2]或 R[i-3]的比特合成一个16比特的字,即对 R[i-1]为“0”的比特、取 R[i-3]的相应比特;对R[i-1]为“1”的比特,取R[i-2]的相应比特,组成一个字,加到R[i]上,然后循环左移r[i]位。这相当于一个非平衡的Feistel结构。

每层的mix运算是对i=0、1、2、3逐一对R[i]进行mix运算。

mash R[i]的定义为:

R[i]=R[i]+K[R[i-1]&63]

即把密钥扩展中的一个字加到R[i]上,以此搅乱R[i]。具体选取密钥扩展中的K[0]~K[63]中的哪个字,由R[i-1]的低6比特决定,所以K[i]的选取依赖于数据。

每层的mash运算是对i=0、1、2、3逐一进行mash R[i]。

一个明文分组的加密过程如下:

(1)用64比特的输入明文分组预置R[0]~R[3];

(2)由输入密钥、π表以及有效密钥长度的上界s进行密钥扩展运算,得到K[0]~K[63];

(3)令j=0;

(4)进行5层的mix运算;

(5)进行1层的mash运算;

(6)进行6层的mix运算;

(7)进行1层的mash运算;

(8)进行5层的mix运算。

经上述处理后的R[0]~R[3]即密文。