RC4算法实验报告.docx
RC4密码算法实验报告
二队十二班胡岩20118130211
一.实验内容:
编程实现RC4加/解密算法。
二.算法分析
#includeiostream.h
#includestring.h
#includestdio.h
#includeconio.h
#includestdlib.h
#includefcntl.h
#includesys\stat.h
#includeio.h
#defineSIZE512
charpData[512]={\0};
typedefunsignedlongULONG;
voidswap(unsignedchar*s,unsignedinti,unsignedintj)
{
unsignedchartemp=s[i];
s[i]=s[j];
s[j]=temp;
}
voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen)
{
inti=0,j=0,k[256]={0};
for(i=0;i256;i++)
{
s[i]=i;
k[i]=key[i%Len];
}
for(i=0;i256;i++)
{
j=(j+s[i]+k[i])%256;
swap(s,i,j);
}
}
voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen)
{
intx=0,y=0,t=0;
unsignedlongi=0;
for(i=0;iLen;i++)
{
x=(x+1)%256;
y=(y+s[x])%256;
t=(s[x]+s[y])%256;
swap(s,x,y);
Data[i]^=s[t];
}
}
voidsave()
{
FILE*fp;
inti;
if((fp=fopen(1.txt,wb))==NULL)
{
cout不能翻开文件!endl;
return;
}
for(i=0;iSIZE;i++)
if(fwrite(pData[i],sizeof(pData[512]),1,fp)!=1)
cout文件写入错误!endl;
fclose(fp);
}
voidmain()
{
inthandle;
charstring[40];
intfunction=1;
intlength,res;
unsignedchars[256]={0};//S-box
charkey[256]={\0};
while(true)
{
if(function==1)
{
cout输入要加密的明文:pDataendl;
cinpData;
ULONGlen=strlen(pData);
cout输入加密所用的密钥:keyendl;
cinkey;
ULONGc=strlen(key);
rc4_init(s,(unsignedchar*)key,strlen(key));//初始化
rc4_crypt(s,(unsignedchar*)pData,len);//加密
cout输出加密后的密文:pDataendl;
save();
}
elseif(function==2)
{
ULONGlen=strlen(pData);
rc4_init(s,(unsignedchar*)key,strlen(key));//初始化
rc4_crypt(s,(unsignedchar*)pData,len);//解密
cout解密后的明文为:pData;
save();
}
elseif(function=3)
{
cout退出RC4加解密系统!endl;
break;
}
else
{
cout请输入正确的命令符:\n;
}
cout\n;
cout输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n;
cout请输入命令符:\n;
cinfunction;
}
}
三.实验结果
〔加密〕
记事本
〔解密〕
记事本
四、实验心得和总结
在编写RC4算法的过程中参考了一些关键性的代码,然后剩下的只是对具体的实现了,其中会用到Swap函数的实现和一些模运算,这都是