RC4算法原理與應用 —— 密碼與密碼工程實踐No.1

RC4密碼簡介:
RC4是由美國密碼學家Ron Rivest在1987年設計的流密碼算法,該算法被廣泛用於 SSL/TLS協議(Socket Secure Layer, SSL)/(Transport Layer Security, TLS),WEP(Wired Equivalent Privacy, WEP)協議和 WPA(Wi-Fi Protected Access, WPA)協議,也作爲蜂窩數字數據包規範的一部分。
RC4是一種基於非線性變換的流密碼算法。該算法包括兩部分:
(1)密鑰編制算法KSA(Key Sehedule Algorithm); 用可變長度的密鑰產生密鑰流生成器的初始狀態S0S_0
(2)僞隨機序列生成算法 PRGA(Pseudo Random Generation Algorithm);根據初始狀態 S0S_0產生密鑰流序列,最終與明文相異或產生密文。

RC4的實現步驟:
部分1 KSA實現步驟:

  1. 隨機選取一個密鑰Key,初始化 S 盒。
  2. iti_t遍歷 S 盒中的每一個位置,iti_t的每一次更新都會使得 jtj_tSt1S_{t-1} [iti_t] 和Key的作用下產生一個新值。
  3. 交換StS_tjtj_titi_t對應的兩個字節。經過N步遍歷後KSA產生了RC4的初始狀態s0s_0。RC4的密鑰。

僞代碼實現:

KSA(Key, S)
for i = 0 to N-1
i0i_0 = 0, j0j_0 = 0;
where t = 1,2,…,N
jtj_t = jt1j_{t-1}+St1S_{t-1}[it1i_{t-1}] + Key[it1i_{t-1} mod 1];
StS_t[iti_t] = St1S_{t-1}[jtj_t], StS_t[jtj_t] = St1S_{t-1}[iti_t];
iti_t = it1i_{t-1} + 1;

部分2 PRGA實現步驟
僞隨機序列的生成原理是不斷地變換 S 盒中的元
素的位置,同時從中選擇一元素輸出,即僞隨機序列,也
稱密鑰流序列。

  1. 根據 KSA 的初始狀態表S0S_0,初始化針iti_tjtj_t
  2. 更新該算法中的 j, 同時交換StS_titi_tjtj_t
    應的字節。
  3. 僞隨機序列生成器不斷地變換S盒中字節的位置,每次改變後將 S 中 StS_t [iti_t] + StS_t [jtj_t] 位置的值輸出,即爲8比特的密鑰流輸出字節,輸出的字節序列是{ZtZ_t} (t : 0 -> \infty),{ZtZ_t}與明文異或加密,與密文異或解密。

僞代碼實現:

PRGA(S0S_0)
Initialization:
i0i_0 = 0;
j0j_0 = 0;
while(true)
iti_t =
(it1i_{t-1} + 1) mod N;
jtj_t = (jt1j_{t-1} + St1S_{t-1}[iti_t]) mod N;
StS_t[iti_t] = St1S_{t-1}[jtj_t], StS_t[jtj_t] = St1S_{t-1}[iti_t];
ZtZ_t = StS_t[(StS_t[iti_t] + StS_t[jtj_t]) mod N];
output ZtZ_t
endwhile

OpenSSL代碼應用:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <openssl/rc4.h>
int main(int argc, char* argv[])
{
    RC4_KEY key;

    const char* data = "Hello,World!!";
    const char* indata = "This is plain text !!!!";
    
    int length = strlen((char *)data);
    int len = strlen((char*)indata);

    RC4_set_key(&key, length, (const unsigned char *)data);            //設置密鑰
    
    unsigned char* outdata;                                            //分配密文空間
    outdata = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));
    memset(outdata, 0, len + 1);                                       //初始爲0
    printf("\tindata=%s\n", indata);
    RC4(&key, strlen(indata), (const unsigned char*)indata, outdata);  //加密明文
    printf("\toutdata=%s\n", outdata);

    unsigned char* plain;                                              //分配明文空間
    plain = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));
    memset(plain, 0, len + 1);                                         //初始化爲0
    RC4_set_key(&key, length, (const unsigned char*)data);             //重新設置密鑰
    RC4(&key, strlen((char *)outdata), outdata, plain);                //解密密文
    printf("\tplain=%s\n", plain);
  
    return 0;
}
 

運行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章