- 密碼算法應用實踐
- 文仲慧等
- 1308字
- 2020-04-03 12:47:00
1.14 RC5和RC6加密算法
RC5是RSA公鑰密碼體制的發明者Ron Rivest于1994年提出的一種分組密碼體制,它可看成一種DES型的迭代分組密碼,以平衡的Feistel結構作為算法的基本框架。該算法有三個突出特點:
① 可變性,即分組長度可變、迭代層數可變、密鑰長度可變;
② 采用依賴于數據的循環移位;
③ 算法的描述特別簡單。
RC5加密算法將明文和密文分組長度的一半稱為字,算法的運算是以字為單位進行的。用w表示字的比特數、用r表示迭代層數、用b表示密鑰的字節數,則RC5-w/r/b表示分組長度為2w比特、密鑰長度為b 字節的 r 層迭代RC5算法。選擇不同的參數,可以得到不同的RC5加密算法。不同的字長適用于不同字長的處理器,不同的迭代層數可以使用戶在速度和安全性兩方面進行折中,不同長度的密鑰能適應不同安全等級以及美國密碼出口控制的要求。
RC6加密算法是AES的候選算法之一,它是RSA公司的Ron Rivest等人在RC5加密算法的基礎上改進而生成的,其分組長度為128比特,迭代層數和密鑰長度可變。和RC5加密算法一樣,RC6加密算法也是用RC6-w/r/b來表示的,推薦的參數為w=32、r=20、b=16、24或32字節。
1.14.1 RC5加密算法
b字節的密鑰可通過密鑰擴展算法得到密鑰擴展表,密鑰擴展表由2r+2字,即S[0], S[1], …, S[2r+1]組成。RC5加密算法對輸入的、由兩個字組成的明文分組(A, B)進行以下加密:
A=A+S[0]
B=B+S[1]
對于i=1到r,進行以下運算:
A=[(A⊕B)<<<B]+S[2i]
B=[(B⊕A)<<<A]+S[2i+1]
式中,“<<<X”表示循環左移X mod w位。當w為2的冪次方時,循環移位數為X的低log2w比特的數值。經上述變化得到的(A, B)即輸出的密文。
密鑰擴展算法由兩個常數,以及三部分變化和計算組成。
兩個常數是由自然對數的底數e=2.718281828459…,以及黃金分割比例?=1.618033988749…來定義的兩個字Pw和Qw,即
Pw=Odd[(e-2)2 w]
Qw=Odd[(?-1)2 w]
式中,Odd(X)是最接近X的奇整數。其實Pw和Qw就是由自然對數的底數e和黃金分割比例?小數點后的w比特構成的整數。當其為偶數時,加1或減1后可變成奇數。具體地講,當小數點后第w+1比特為1時加1,反之,減1。w=16、32、64時的常數(用十六進制表示)分別為:
P16=b7e1
Q16=9e37
P32=b7e15163
Q32=9e3779b9
P64=b7e151628aed2a6b
Q64=9e3779b97f4a7c15
密鑰擴展表是通過以下三部分變化和計算生成的。
(1)將密鑰由字節轉換成字。設u=w/8,則u為每個字的字節數,將b字節的密鑰K[0],K[1], …, K[b-1]從低比特到高比特排列成字,記為 L[0], L[1], …, L[c-1],其中 c=[b/u]。當 u 不能整除b時,則在高比特填補0。
用計算機語言來描述,即先對 L[0], L[1], …, L[c-1]置0,再對 i=b-1至0進行L[i/u]=(L[i/u]<<<8)+K[i]運算。
(2)用常數Pw和Q 生成S數組。令S[0]=Pw,對于i=1到2r+1計算S[i]=S[i-1]+Qw mod 2w,可得S數組,即S[0], S[1], …, S[2r+1]。對于給定的字長w, S數組是固定的以字為單位的常數數組。
(3)將常數數組S與密鑰數組L混亂,生成密鑰擴展表。密鑰擴展表是由S數組和L數組經反復累加、移位生成的,累加、移位的次數為兩個數組中較長數組字數的3倍。具體描述如下:
令i=j=0, A=B=0,進行3×max[(2r+2), c]次下列運算:
A=S[i]=(S[i]+A+B)<<<3
B=L[j]+(L[j]+A+B)<<<(A+B)
i=(i+1)mod(2r+2)
j=(j+1)mod c
計算結束后的S[0], S[1], …, S[2r+1]就是加密所用的密鑰擴展表。
1.14.2 RC6加密算法
RC6加密算法需要2r+4個層密鑰,由b字節的密鑰通過密鑰擴展算法得到2r+4個層密鑰的過程同RC5加密算法完全一樣。
加密的過程如下。
將128比特的明文分組分成4個32比特的字(A, B, C, D)后,進行如下運算。
B=B+S[0]
D=D+S[1]
對于i=1到r,進行如下偽代碼所示的運算。
{ t=(B×(2B+1))<<<lgw; u=(D×(2D+1))<<<lgw; A=((A⊕t)<<<u)+S[2i]; C=((C⊕u)<<<t)+S[2i+1]; (A, B, C, D)=(B, C, D, A); } A=A+S[2r+2]; C=C+S[2r+3];
(A, B, C, D)即輸出的密文。