通过三个可变参数可确定一组加密算法,可表示为RC5-w/r/b。w表示明文/秘文字分组后的字长,完整明文/秘文字长为2w;w一般长度为16,32,64。r表示加密轮数,0
表1-1 RC5涉及的运算符
Tab.1-1 Operators involved in RC5
符号 | 含义 |
X<< | X循环左移Ybit |
+ | 模2^w加 |
^ | 逐为异或 |
第一步:初始化两个有w决定的常数Pw和Qw,。这两个常数的定义如下:
Pw = Odd((e-2)*2^w)
Qw =Odd((q-1)*2^w)
其中e=2.718281828459...(自然对数的底),q=1.618033988749...(黄金分割),Odd[x]表示距离x最近的奇数,对于w=16,32,64时,Pw,Qw用十六进制表示如表1-1所示:
表1-2 Pw、Qw的十六进制表示
Table 1-2 Hexadecimal representation of PW and QW
w | 16 | 32 | 64 |
Pw | b7e1 | b7e15163 | b7e151628aed2a6b |
Qw | 9e37 | 9e377b9 | 9e3779b97f4a7c15 |
第二步:将密钥由字节数组Key[0,...,b-1]填充得到数组L[0,...,c-1],c= [b/u],u= w/8, 在这w=32,故u=4,c=4,填充时从地位到高位按自然顺序填充,即L[0] = key[31:24] key [23:16] key [15:8] key [7:0];L[1] = key [63:56] key [55:48] key [47:40] key [39:32];L[2] = key [95:88] key [87:80] key [79:72] key [71:64];L[3] = key [127:120] key [119:112] key [111:104] key[103:96][2];算法描述为
i=j=0,x=y=0
Do 3*max(t,c)times;
S[i]=(S[i]+s+y)<<<3;x=S[i];i=(i+1)mod(t);
L[j]=(L[j]+x+y)<<<(x+y);x=L[j];j=(j+1)mod(c);
其中t=2r+2;
第三步:经26轮的迭代循环密钥混合后的得出26个子密钥。
i=j=0;
A =B =0;
Do 3*max(t,c)times;
A=S[i]=(S[i]+A+B)<<<3;
B=L[j]=(L[j]+A+B)<<<(A+B);
i=(i+1)mod(t);
j=(j+1)mod(c);
RC5密钥扩展算法的流程图,如图1.2.1是基于RC5-w/r/b=RC5-32、12、16的流程图
图1-1 RC5-w/r/b=RC5-32、12、16
Fig.1-1 RC5-W/R/B = RC5-32, 12, 16
用于存放子密钥的变量s被定义为832bit,以存放26个子密钥,s的初始值设为0,通过逐个加32’h9e3779b9形成固定的26个初始化密钥。该加法过程描述如下:
S[31:0] = 32’d0+32’h9e3779b9;
S[63:32] = S[31:0] + 32’h9e3779b9;
...
S[831:800] = S[799:768]+ 32’h9e3779b9;
RC5加密算法的加密过程需要输入2wbit的明文,分别存于a和b两个寄存器,加密步骤描述如下:
先用a和b分别模2^w加上s[0]和s[1],再赋值给a,b,完成a和b的初始化;
(1)a和b异或赋给a,a再循环左移bit;
(2)a模2^w加s[2*i],再赋给a,此时a为这一轮的最新值;
(3)a的最新值异或b,存入b;
(4)把b循环左移abit,注意要用a的最新值;
(5)B模2^w加s[2*i+1],存入b;
(8)回到(1),重复复执行r轮。
伪代码描述如下:
A = A + S[0]
B = B + S[1]
for i = 1 to r do:
A = ((A ^ B) <<< B) + S[2 * i]
B = ((B ^ A) <<< A) + S[2 * i + 1]
return A, B
加密的逆过程即为解密,用伪代码描述如下:
for i = r down to 1 do:
B = ((B - S[2 * i + 1]) >>> A) ^ A
A = ((A - S[2 * i]) >>> B) ^ B
B = B - S[1]
A = A - S[0]
return A, B