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); 用可變長度的密鑰產生密鑰流生成器的初始狀態。
(2)僞隨機序列生成算法 PRGA(Pseudo Random Generation Algorithm);根據初始狀態 產生密鑰流序列,最終與明文相異或產生密文。
RC4的實現步驟:
部分1 KSA實現步驟:
- 隨機選取一個密鑰Key,初始化 S 盒。
- 遍歷 S 盒中的每一個位置,的每一次更新都會使得 在 [] 和Key的作用下產生一個新值。
- 交換中和對應的兩個字節。經過N步遍歷後KSA產生了RC4的初始狀態。RC4的密鑰。
僞代碼實現:
KSA(Key, S)
for i = 0 to N-1
= 0, = 0;
where t = 1,2,…,N
= +[] + Key[ mod 1];
[] = [], [] = [];
= + 1;
部分2 PRGA實現步驟
僞隨機序列的生成原理是不斷地變換 S 盒中的元
素的位置,同時從中選擇一元素輸出,即僞隨機序列,也
稱密鑰流序列。
- 根據 KSA 的初始狀態表,初始化針和。
- 更新該算法中的 j, 同時交換中和對
應的字節。 - 僞隨機序列生成器不斷地變換S盒中字節的位置,每次改變後將 S 中 [] + [] 位置的值輸出,即爲8比特的密鑰流輸出字節,輸出的字節序列是{} (t : 0 -> ),{}與明文異或加密,與密文異或解密。
僞代碼實現:
PRGA()
Initialization:
= 0;
= 0;
while(true)
=
( + 1) mod N;
= ( + []) mod N;
[] = [], [] = [];
= [([] + []) mod N];
output
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;
}
運行結果如下: