RC4加密算法

RC4加密算法是一種對稱加密算法。算法

對稱加密算法

對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰可以從解密密鑰中推算出來,同時解密密鑰也能夠從加密密鑰中推算出來。而在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,因此也稱這種加密算法爲祕密密鑰算法或單密鑰算法。它要求發送方和接收方在安全通訊以前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人均可以對他們發送或接收的消息解密,因此密鑰的保密性對通訊的安全性相當重要。數組

 

RC4加密算法

  RC4算法的特色是算法簡單,運行速度快,並且密鑰長度是可變的,可變範圍爲1-256字節(8-2048比特),在現在技術支持的前提下,當密鑰長度爲128比特時,用暴力法搜索密鑰已經不太可行,因此能夠預見RC4的密鑰範圍任然能夠在從此至關長的時間裏抵禦暴力搜索密鑰的攻擊。實際上,現在也沒有找到對於128bit密鑰長度的RC4加密算法的有效攻擊方法。安全

 

RC4算法的原理很簡單,包括初始化算法(KSA)和僞隨機子密碼生成算法(PRGA)兩大部分。假設S-box的長度爲256,密鑰長度爲Len。先來看看算法的初始化部分(用C代碼表示):
其中,參數1是一個256長度的char型 數組,定義爲: unsigned char sBox[256];
參數2是密鑰,其內容能夠隨便定義:char key[256];
參數3是密鑰的長度,Len = strlen(key);
 
/*初始化函數*/
void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
    int i=0,j=0;
    char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++) {
        s[i]=i;
        k[i]=key[i%Len];
    }
    for(i=0;i<256;i++) {
        j=(j+s[i]+k[i])%256;
        tmp=s[i];
        s[i]=s[j];//交換s[i]和s[j]
        s[j]=tmp;
    }
}

 

在初始化的過程當中, 密鑰的主要功能是將S-box攪亂,i確保S-box的每一個元素都獲得處理,j保證S-box的攪亂是隨機的。而不一樣的S-box在通過 僞隨機子密碼生成算法的處理後能夠獲得不一樣的子密鑰序列,將S-box和明文進行xor運算,獲得密文,解密過程也徹底相同。
再來看看算法的加密部分(用C代碼表示):
其中,參數1是上邊rc4_init函數中,被攪亂的S-box;
參數2是須要加密的數據data;
參數3是data的長度.
 
 
/*加解密*/
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)
    {
        i=(i+1)%256;
        j=(j+s[i])%256;
        tmp=s[i];
        s[i]=s[j];//交換s[x]和s[y]
        s[j]=tmp;
        t=(s[i]+s[j])%256;
        Data[k]^=s[t];
    }
}

 

 

 

讓咱們看一看完整程序函數

 

//程序開始
#include<stdio.h>
#include<string.h>
typedef unsigned longULONG;
 
/*初始化函數*/
void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
{
    int i = 0, j = 0;
    char k[256] = { 0 };
    unsigned char tmp = 0;
    for (i = 0; i<256; i++)
    {
        s[i] = i;
        k[i] = key[i%Len];
    }
    for (i = 0; i<256; i++)
    {
        j = (j + s[i] + k[i]) % 256;
        tmp = s[i];
        s[i] = s[j];//交換s[i]和s[j]
        s[j] = tmp;
    }
}
 
/*加解密*/
void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len)
{
    int i = 0, j = 0, t = 0;
    unsigned long k = 0;
    unsigned char tmp;
    for (k = 0; k<Len; k++)
    {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        tmp = s[i];
        s[i] = s[j];//交換s[x]和s[y]
        s[j] = tmp;
        t = (s[i] + s[j]) % 256;
        Data[k] ^= s[t];
    }
}
 
int main()
{
    unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box
    char key[256] = { "justfortest" };
    char pData[512] = "這是一個用來加密的數據Data";
    unsigned long len = strlen(pData);
    int i;
 
    printf("pData=%s\n", pData);
    printf("key=%s,length=%d\n\n", key, strlen(key));
    rc4_init(s, (unsigned char*)key, strlen(key));//已經完成了初始化
    printf("完成對S[i]的初始化,以下:\n\n");
    for (i = 0; i<256; i++)
    {
        printf("%02X", s[i]);
        if (i && (i + 1) % 16 == 0)putchar('\n');
    }
    printf("\n\n");
    for (i = 0; i<256; i++)//用s2[i]暫時保留通過初始化的s[i],很重要的!!!
    {
        s2[i] = s[i];
    }
    printf("已經初始化,如今加密:\n\n");
    rc4_crypt(s, (unsigned char*)pData, len);//加密
    printf("pData=%s\n\n", pData);
    printf("已經加密,如今解密:\n\n");
    //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密鑰
    rc4_crypt(s2, (unsigned char*)pData, len);//解密
    printf("pData=%s\n\n", pData);
    return 0;
}
 
//程序完
相關文章
相關標籤/搜索