官术网_书友最值得收藏!

  • 密碼算法應用實踐
  • 文仲慧等
  • 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=[(AB)<<<B]+S[2i]

B=[(BA)<<<A]+S[2i+1]

式中,“<<<X”表示循環左移X mod w位。當w為2的冪次方時,循環移位數為X的低log2w比特的數值。經上述變化得到的(A, B)即輸出的密文。

密鑰擴展算法由兩個常數,以及三部分變化和計算組成。

兩個常數是由自然對數的底數e=2.718281828459…,以及黃金分割比例?=1.618033988749…來定義的兩個字PwQw,即

Pw=Odd[(e-2)2 w]

Qw=Odd[(?-1)2 w]

式中,Odd(X)是最接近X的奇整數。其實PwQw就是由自然對數的底數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)用常數PwQw生成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=((At)<<<u)+S[2i];
    C=((Cu)<<<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)即輸出的密文。

主站蜘蛛池模板: 海兴县| 禄丰县| 冀州市| 康定县| 唐山市| 海林市| 闻喜县| 贡山| 志丹县| 洱源县| 大丰市| 丰镇市| 民丰县| 汕头市| 屯留县| 哈巴河县| 蓬溪县| 元朗区| 新密市| 延庆县| 泸定县| 抚松县| 马尔康县| 房山区| 卢龙县| 正蓝旗| 齐齐哈尔市| 铜川市| 宁都县| 黑水县| 榆林市| 府谷县| 兴业县| 宜川县| 昌都县| 金沙县| 绥宁县| 汉川市| 高唐县| 虞城县| 临朐县|