⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc4.cpp

📁 刚学的加密算法
💻 CPP
字号:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
unsigned char k[8],temptable[30000],plaintable[30000],nowtable[30000],sonkey[30000] ; int  plainlength,klength;
int ktable[256],stable[256];
class rc4
{
  public:
	  static unsigned char xor(unsigned char a,unsigned char b);    //加解密的时候进行异或运算,注意要转换成unsigned char类型,否则异或会出现大于255的现象
	  static void swap( int *a, int *b);   //两个数进行交换操作
	  static void KSA();      //密钥调度
	  static void PRGA();     //伪随机生成
	  void cryption();         //加密
	  void decryption();      //解密
	  void dtoh(unsigned char a);   //转换成16进制输出
	  rc4() {};   //构造函数

};

unsigned char rc4::xor(unsigned char a,unsigned char b)
{
	return a^b;
}


void rc4::swap( int *a, int *b)
{
    int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}

void rc4::KSA()
{
	int i,j=0;
	for(i=0;i<256;i++)
	{
		j=(j+stable[i]+( int)ktable[i])%256;
		swap(&stable[i],&stable[j]);
	}
	cout<<endl;
	cout<<"************************"<<endl;
	cout<<"Output Key"<<endl;
    for(i=0;i<256;i++)
		cout<<stable[i]<<" ";
	cout<<endl;

}

void rc4::PRGA()
{
    int m=0,i=0,j=0,t,l;l=plainlength;
	while(l--)     //密钥长度要和明文长度一致
	{
		i=(i+1)%256;
		j=(j+stable[i])%256;
		swap(&stable[i],&stable[j]);
		t=(stable[j]+stable[i])%256;
		sonkey[m++]=stable[t];               //将子密钥存放在sonkey数组中
	}
	
}

void rc4::cryption()
{
	KSA();
	PRGA();
	for(int i=0;i<plainlength;i++)
		temptable[i]=xor(plaintable[i],sonkey[i]); //将明文和密钥异或运算

}

void rc4::decryption()
{
	for(int i=0;i<plainlength;i++)
		nowtable[i]=xor(temptable[i],sonkey[i]);   //将密文和密钥异或运算
}
void rc4::dtoh(unsigned char a)
{   
	    int high,low;
	//	cout<<(int)a<<"  ";   
	   low=a%16;
		high=(int)a/16; 
    	if(high>=10) cout<<(char)(high+55);       //大于10的或要装换成相应的字符形式
		else cout<<high;
		if(low>=10) cout<<(char)(low+55)<<" ";
			else cout<<low<<" ";  
      
	
	

}

int main()
{    
	 rc4 *RC;RC=new rc4();
     int i,j;
	 for(i=0;i<256;i++)      //初始s数据表
		 stable[i]=i;
	  cout<<"Input Key"<<endl;
      
	  cin.getline((char*)k,9);
	  klength=strlen((char*)k);
	  cout<<"********************************"<<endl;
	  cout<<"Input PlainText"<<endl;
	  

	  cin.getline((char*)plaintable,30000);
      plainlength=strlen((char*)plaintable);
	  for(i=0,j=0;i<256;i++)
	  { 
		  ktable[i]=k[j++];      //初始k数据表
		  j%=klength;
	  }
	  RC->cryption();         //加密
	  cout<<"***********************"<<endl;
      cout<<"CipherText"<<endl;
	  for(i=0;i<plainlength;i++)
		  RC->dtoh(temptable[i]);   //装换成116进制输出
	  cout<<endl;
	  cout<<"***********************"<<endl;
	  cout<<"Decryption"<<endl;
      RC->decryption();       //解密
	  for(i=0;i<plainlength;i++)
		  cout<<plaintable[i];

	  return 0;
	  


      
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -