📄 rc4.cpp
字号:
#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]<<" ";*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -