RC4的原理
- 提问者网友:孤凫
- 2021-01-26 05:33
- 五星知识达人网友:不如潦草
- 2021-01-26 06:19
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
,key,strlen(key));rc4_init(s,(unsigned char*)key,strlen(key));//已经完成了初始化printf(完成对S[i]的初始化,如下:
);for(i=0;i<256;i++){ printf(%02X,s[i]); if(i&&(i+1)%16==0)putchar('
');}printf(
);for(i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{ s2[i]=s[i];}printf(已经初始化,现在加密:
);rc4_crypt(s,(unsigned char*)pData,len);//加密printf(pData=%s
,pData);printf(已经加密,现在解密:
);//rc4_init(s,(unsigned char*)key,strlen(key));//初始化密钥rc4_crypt(s2,(unsigned char*)pData,len);//解密printf(pData=%s
,pData);return0;}因此最终的完整程序是: //程序开始#include
, key, strlen(key)); rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化 printf(完成对S[i]的初始化,如下:
); for (i = 0; i<256; i++) { printf(%02X, s[i]); if (i && (i + 1) % 16 == 0)putchar('
'); } printf(
); for (i = 0; i<256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!! { s2[i] = s[i]; } printf(已经初始化,现在加密:
); rc4_crypt(s, (unsigned char*)pData, len);//加密 printf(pData=%s
, pData); printf(已经加密,现在解密:
); //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥 rc4_crypt(s2, (unsigned char*)pData, len);//解密 printf(pData=%s
, pData); return 0;}//程序完