RC4算法
加密流程
核心原理
1.KSA(Key Scheduling Algorithm)密钥调度算法 初始化一个长度为 256 的 S 盒(0~255 的排列)。 根据密钥对 S 盒进行多轮置换,打乱初始顺序。
2.PRGA(Pseudo-Random Generation Algorithm)伪随机数生成算法 不断更新 S 盒状态,生成伪随机字节流。 将该字节流与明文逐字节异或,得到密文;解密时同样操作即可还原明文2。
详细步骤
1.选择1到256字节的数据作为密钥,并且作为初始状态向量
2.根据状态向量的值生成一个有256个不同数字的S盒
3.创建两个256个数字的数组,并将其初始化为0至255的连续整数。其中一个数组用于存储索引的顺序,另一个数组用于保存S盒中的值。
4.根据密钥的每个字节,使用一种类似加法的置换算法来初始化数组的索引。密钥字节与数组索引的值进行异或运算,从而改变索引的顺序和位置
5.通过将数组索引循环递增,对S盒中的值进行交换,以生成伪随机的密钥流
6.将明文或密文与生成的密钥流进行异或运算,从而完成加密/解密操作。同时,状态向量和数组的索引也会随着每个加密/解密字节的生成而更新
7.密钥流重复利用:对于较长的数据流(例如文件),可以循环使用生成的密钥流。每次使用一部分密钥流后,继续生成下一部分,从而实现密钥流的重复使用
流程图

参考https://blog.csdn.net/Jsy050906/article/details/137167432
代码实现步骤
初始化
参数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 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; } }
加密
参数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]; } }
调用顺序
`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,(unsigned char)key,strlen(key));//初始化密钥
rc4_crypt(s2,(unsigned char)pData,len);//解密
printf("pData=%s\n\n",pData);
return0;
}`

浙公网安备 33010602011771号