RC4加密原理及代码

近日由于用了RC4的知识,所以就对其进行了查阅,并且进行了实现,列于以下:
RC4算法介绍
     RC4加密算法Ron Rivest(非常有名的非对称加密算法RSA三巨头之一)在1987年设计的,密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
 备注:RC4是对称密钥加密算法,而RSA是非对称的加密算法。由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。那么,RC4算法生成的子密钥序列是否会出现重复呢?由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一。

 

转自:http://wzgyantai.blogbus.com/logs/31867065.html

 

说白了就是调用两次相同的方法,就会将第一加密的数据还原成原始数据,这里的原始数据长度和私钥很重要。

 

#include<iostream>
#include<cstring>
using namespace std;


void crypt(char cipher[]);///////////////////////////////解密过程函数,根据输入密钥再一次生成密钥流
void main()
{
 cout<<"**************************RC4加解密程序**************************"<<endl;
 cout<<"****************************欢迎使用*****************************"<<endl;
 char choose1,choose2;
 do{
int s[256],t[256];
char k[256];/////////////////用户输入的密钥
char plaintext[1024],ciphertext[1024];
cout<<"输入密钥:";
cin>>k;
for(int i=0;i<256;i++)//////////////给字节状态矢量和可变长的密钥数组赋值
{
 s[i]=i;
 t[i]=k[i%strlen(k)];
}
int j=0;
for(int i=0;i<256;i++) //////使用可变长的密钥数组初始化字节状态矢量数组s
{
 int temp;
 j=(j+s[i]+t[i])%256;
 temp=s[i];
 s[i]=s[j];
 s[j]=temp;
}
cout<<"/n输入要加密的字符串:"<<endl;
cin>>plaintext;
int m,n,key[256],q;
m=n=0;
int i;
cout<<"/n得到密文:"<<endl;
for(i=0;i<strlen(plaintext);i++)/////////////由字节状态矢量数组变换生成密钥流并对明文字符进行加密
{
 int temp;
m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
ciphertext[i]=plaintext[i]^key[i];
cout<<ciphertext[i];

}
ciphertext[i]='/0';
cout<<endl;
/*cout<<"/n密钥流是:";
for(int i=0;i<strlen(plaintext);i++)
cout<<key[i]<<" ";
cout<<endl;*/

//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//解密
cout<<"/n是否对上面的密文进行解密?(y/n)";
cin>>choose2;
while(choose2=='y'||choose2=='Y')
{
 /*cout<<"/n解密后所得到的明文是:"<<endl;
for(int p=0;p<strlen(plaintext);p++)/////////////通过加密时所记录的密钥流对加密密文进行解密
{
 plaintext[p]=ciphertext[p]^key[p];
 cout<<plaintext[p];
}
cout<<endl;*/
 crypt(ciphertext);///////////////////////////////解密过程函数
choose2='n';
}
cout<<endl;
cout<<"/n是否希望继续使用程序?(y/n)";
cin>>choose1;
 }while(choose1=='y'||choose1=='Y');

 cout<<"/n****************************程序结束*****************************"<<endl<<endl;
system("pause");
}

 

/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//解密函数,密钥流的生成与加密相同

void decrypt(char cipher[])
{
int s[256],t[256];
char k[256];/////////////////用户输入的密钥
char plaintext[1024];
cout<<"/n输入密钥:";
cin>>k;
for(int i=0;i<256;i++)//////////////给字节状态矢量和可变长的密钥数组赋值
{
 s[i]=i;
 t[i]=k[i%strlen(k)];
}
int j=0;
for(int i=0;i<256;i++) //////使用可变长的密钥数组初始化字节状态矢量数组s
{
 int temp;
 j=(j+s[i]+t[i])%256;
 temp=s[i];
 s[i]=s[j];
 s[j]=temp;
}

int m,n,key[256],q;
m=n=0;
int i;
cout<<"/n解密后所得到明文是:"<<endl;
for(i=0;i<strlen(cipher);i++)/////////////由字节状态矢量数组变换生成密钥流并对密文字符进行解密
{
 int temp;
m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
plaintext[i]=cipher[i]^key[i];
cout<<plaintext[i];

}

cout<<endl;
/*cout<<"/n密钥流是:";
for(int i=0;i<strlen(cipher);i++)
cout<<key[i]<<" ";*/
}

 

 

没有更多推荐了,返回首页