RC4算法时Ron Rivest在1987年设计的一种流密码,它非常简单,易于描述,其加密密钥和解密密钥相同,密钥长度可变,但为了确保密码算法的安全强度,目前RC4使用至少128位的密钥。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef unsigned long ULONG;
void swap(unsigned char * S,unsigned int i,unsigned int j)
{
unsigned char temp = S[i];
S[i]=S[j];
S[j]=temp;
}
void rc4_init(unsigned char * S,unsigned char * K,unsigned long Len)
{
int i=0,j=0,T[256]={0};
for(i=0;i<256;i++)
{
S[i]=i;
T[i]=K[i%Len];
}
for(i=0;i<256;i++)
{
S[i]=i;
T[i]=K[i%Len];
for(i=0;i<256;i++)
{
j=(j+S[i]+T[i])%256;
swap(S,i,j);
}
}
}
void rc4_crypt(unsigned char *S,unsigned char *Data,unsigned long Len)
{
int x=0,y=0,t=0;
unsigned long i=0;
for(i=0;i<Len;i++)
{
x=(x+1)%256;
y=(y+S[x])%256;
t=(S[x]+S[y])%256;
swap(S,x,y);
Data[i]^=S[t];
}
}
int main()
{
int function=1;
unsigned char S[256]={0};
char K[256]={"其实RC4算法很简单!"};
char pData[256]={"\0"};
while(1)
{
if(function == 1)
{
printf("输入要加密的明文:");
scanf("%s",&pData);
ULONG len=strlen(pData);
printf("输入加密所用的密钥:%s\n",K);
printf("输入密钥的长度:%d\n",strlen(K));
rc4_init(S,(unsigned char *)K,strlen(K));
rc4_crypt(S,(unsigned char *)pData,len);
printf("输出加密后的密文:%s",pData);
}
else if(function==2)
{
ULONG len =strlen(pData);
rc4_init(S,(unsigned char *)K,strlen(K));
rc4_crypt(S,(unsigned char *)pData,len);
printf("输出解密后的明文:%s",pData);
}
else if(function==3)
{
printf("退出RC4加解密系统!\n");
break;
}
else
{
printf("请输入正确的命令符:\n");
}
printf("\n");
printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
printf("请输入命令符:\n");
scanf("%d",&function);
}
system("pause"); // 防止运行后自动退出,需头文件stdlib.h
return 0;
}
结果