RC5

RC5分組密碼算法是1994由麻薩諸塞技術研究所的Ronald L. Rivest教授發明的,並由RSA實驗室分析。它是參數可變的分組密碼算法,三個可變的參數是:分組大小、密鑰大小和加密輪數。在此算法中使用了三種運算:異或、加和循環。

基本介紹

  • 名稱:RC5
  • 提出時間:1994年
  • 提出人:Ronald L. Rivest教授
  • 定義:參數可變的分組密碼算法
  • 可變參數:分組大小、密鑰大小和加密輪數
  • 使用運算:異或、加和循環
相關介紹,簡介,加密解密,參考例子,宏定義,函式定義,常見模式,電子密碼本,密碼分組連結,密碼反饋,輸出反饋,

相關介紹

簡介

RC5是種比較新的算法,Rivest設計了RC5的一種特殊的實現方式,因此RC5算法有一個面向字的結構:RC5-w/r/b,這裡w是字長其值可以是16、32或64對於不同的字長明文和密文塊的分組長度為2w位,r是加密輪數,b是密鑰位元組長度。由於RC5一個分組長度可變的密碼算法,為了便於說明在本文中主要是針對64位的分組w=32進行處理的,下面詳細說明了RC5加密解密的處理過程:

加密解密

1、創建密鑰
RC5算法加密時使用了2r+2個密鑰相關的的32位字: ,這裡r表示加密的輪數。創建這個密鑰組的過程是非常複雜的但也是直接的,首先將密鑰位元組拷貝到32位字的數組L中(此時要注意處理器是little-endian順序還是big-endian順序),如果需要,最後一個字可以用零填充。然後利用線性同餘發生器模2初始化數組S:
對於i=1到2(r+1)-1: (本應模 ,本文中令w=32)
其中對於16位字32位分組的RC5,P=0xb7e1 Q=0x9e37
對於32位字和64位分組的RC5,P=0xb7e15163 Q=0x9e3779b9
對於64位字和128位分組,P=0xb7151628aed2a6b Q=0x9e3779b97f4a7c15
最後將L與S混合,混合過程如下:
i=j=0
A=B=0
處理3n次(這裡n是2(r+1)和c中的最大值,其中c表示輸入的密鑰字的個數)
2、加密處理
在創建完密鑰組後開始進行對明文的加密,加密時,首先將明文分組劃分為兩個32位字:A和B(在假設處理器位元組順序little-endian、w=32的情況下,第一個明文位元組進入A的最低位元組,第四個明文位元組進入A的最高位元組,第五個明文位元組進入B的最低位元組,以此類推),其中操作符<<<表示循環左移,加運算是模 (本應模 ,本文中令w=32)的。
輸出的密文是在暫存器A和B中的內容
3、解密處理
解密也是很容易的,把密文分組劃分為兩個字:A和B(存儲方式和加密一樣),這裡符合>>>是循環右移,減運算也是模 (本應模 ,本文中令w=32)的。
RSA試驗室花費了相當的時間來分析64位分組的RC5算法,在5輪後統計特性看起來非常好。在8輪後,每一個明文位至少影響一個循環。對於5輪的RC5,差分攻擊需要 個選擇明文;對10輪需要 個;對於12輪需要 個;對15輪需要 個。而對於64位的分組只有 個可能的明文,所以對於15輪或以上的RC5的差分攻擊是失敗的。在6輪後線性分析就是安全的了,Rivest推薦至少12輪,甚至可能是16輪。這個輪數可以進行選擇。

參考例子

rfc 2040文檔中列出了RC5算法密鑰生成和加密實現的C代碼,在此筆者參照文檔中定義的算法結構,編寫了用於對密文解密的程式代碼(此代碼經多次測試運行良好),供讀者參考。

宏定義

1、補充了兩個個宏定義
#define SHL1(x,s,w) ((RC5_WORD)((x)<<((w)-((s)&ROT_MASK))))
#define ROTR(x,s,w) ((RC5_WORD)(SHR1((x),(s))|SHL1((x),(s),(w))))

函式定義

2、解密函式定義如下:
void RC5_Block_Decrypt (RC5_WORD *S,int R,char *in,char *out)
{
int i;
RC5_WORD A,B;
A = in[0] & 0xFF;
A += (in[1] & 0xFF) << 8;
A += (in[2] & 0xFF) << 16;
A += (in[3] & 0xFF) << 24;
B = in[4] & 0xFF;
B += (in[5] & 0xFF) << 8;
B += (in[6] & 0xFF) << 16;
B += (in[7] & 0xFF) << 24;
for(i=R;i>=1;i--){
B=ROTR((B-S[2*i+1]),A,W);
B=B^A;
A=ROTR((A-S[2*i]),B,W);
A=A^B;
}
B=B-S[1];
A=A-S[0];
out[0] = (A >> 0) & 0xFF;
out[1] = (A >> 8) & 0xFF;
out[2] = (A >> 16) & 0xFF;
out[3] = (A >> 24) & 0xFF;
out[4] = (B >> 0) & 0xFF;
out[5] = (B >> 8) & 0xFF;
out[6] = (B >> 16) & 0xFF;
out[7] = (B >> 24) & 0xFF;
return;
}/*End of RC5_Block_Decrypt */
int RC5_CBC_Decrypt_Init (pAlg, pKey)
rc5CBCAlg *pAlg;
rc5UserKey *pKey;
{
if ((pAlg == ((rc5CBCAlg *) 0)) ||
(pKey == ((rc5UserKey *) 0)))
return (0);
RC5_Key_Expand (pKey->keyLength, pKey->keyBytes,pAlg->R, pAlg->S);
return (RC5_CBC_SetIV(pAlg, pAlg->I));
}
int RC5_CBC_Decrypt_Update(rc5CBCAlg *pAlg,int N,char *C,int *plainLen,char *P)
{
int plainIndex,cipherIndex,j;
plainIndex=cipherIndex=0;
for(j=0;j<BB;j++)
{
P[plainIndex]=pAlg->chainBlock[j];
plainIndex++;
}
plainIndex=0;
while(cipherIndex<N)
{
if(pAlg->inputBlockIndex<BB)
{
pAlg->inputBlock[pAlg->inputBlockIndex]=C[cipherIndex];
pAlg->inputBlockIndex++;
cipherIndex++;
}
if(pAlg->inputBlockIndex==BB)
{
pAlg->inputBlockIndex=0;
RC5_Block_Decrypt (pAlg->S,pAlg->R,pAlg->inputBlock,pAlg->chainBlock);
for(j=0;j<BB;j++)
{
if(plainIndex<BB)
P[plainIndex]^=pAlg->chainBlock[j];
else
P[plainIndex]=C[cipherIndex-16+j]^pAlg->chainBlock[j];
plainIndex++;
}
}
}
*plainLen=plainIndex;
return (1);
}/*End of RC5_CBC_Decrypt_Update*/

常見模式

以上的操作只是針對的一個明文分組的,對於分組加密算法有以下幾種比較常見的分組密碼模式:

電子密碼本

電子密碼本(Electronic Code Book,,ECB)模式是使用分組密碼算法的最明顯的方式,其使用方式是一個明文分組加密成一個密文分組,相同的明文分組永遠被加密成相同的密文分組,在理論上製造這樣的一個密碼本是可行的,但實際上要進行大量的預計算耗費存儲空間,最容易的運行模式是每個明文分組可被獨立地進行加密,但受分組重放攻擊

密碼分組連結

密碼分組連結模式(Cipher Block Chaining,CBC)模式中,明文被加密之前要與前面的密文進行異或運算,如果前面的明文分組不同才能將完全相同的明文分組加密成不同的密文分組,這會給密碼分析者提供有用的線索,為了防止這種情況發生使用一個隨機數據分組作為加密的第一個分組叫作初始化向量(initialization Vector,IV),這樣就可以把完全相同的信息加密成不同的密文訊息。

密碼反饋

密碼反饋模式(Cipher-Feedback,CFB)是把分組密碼算法用於自同步序列密碼的一種方法,在CBC模式下,整個數據分組在接收完之後才能進行加密,在此模式下數據可以在比分組小的多的單元里進行處理。

輸出反饋

輸出反饋模式(Output-Feedback,OFB)是將分組密碼用於同步序列密碼運行的一種方法,它有一個很好的特性就是在明文存在前的大部分工作可以離線進行。以上幾種模式中密碼分組連結模式是在安全協定中使用的最為普遍,在無線套用協定中安全層定義的分組加密算法都是CBC模式。幾大手機廠家如Nokia,Motorala,Erison的WAP手機的首選的分組加密算法就是RC5

相關詞條

熱門詞條

聯絡我們