?? rc4.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 + -