2011年2月16日 星期三

RC4加密原理及代码 - guhog的专栏 - CSDN博客

RC4加密原理及代码 - guhog的专栏 - CSDN博客: "原创 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
#include
using namespace std;


void crypt(char cipher[]);///////////////////////////////解密过程函数,根据输入密钥再一次生成密钥流
void main()
{
cout<<'**************************RC4加解密程序**************************'<>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输入要加密的字符串:'<>plaintext;
int m,n,key[256],q;
m=n=0;
int i;
cout<<'\n得到密文:'<>choose2;
while(choose2=='y'||choose2=='Y')
{
/*cout<<'\n解密后所得到的明文是:'<>choose1;
}while(choose1=='y'||choose1=='Y');

cout<<'\n****************************程序结束*****************************'<>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]<<' ';*/
}

- 已使用 Google 工具列寄出"

沒有留言:

張貼留言