流密码与分组密码编程
上机一:流密码与分组密码编程
【上机目的】
熟悉流密码和分组密码加密/解密算法的基本原理,通过编程/开源代码分析分别了解一种标准流密码算法和一种标准分组密码算法的运行原理。
【上机环境】
硬件 Png &);
private:
unsigned char S[256]; //状态向量,共256字节
unsigned char T[256]; //临时向量,共256字节
int keylen; //密钥长度,keylen个字节,取值范围为1-256
vector<char> K; //可变长度密钥
vector<char> k; //密钥流
/*
初始化状态向量S和临时向量T,供keyStream方法调用
*/
void initial() {
for(int i=0;i<256;++i){
S[i]=i;
T[i]=K[i%keylen];
}
}
/*
初始排列状态向量S,供keyStream方法调用
*/
void rangeS() {
int j=0;
for(int i=0;i<256;++i){
j=(j+S[i]+T[i])%256;
//cout<<"j="<<j<<endl;
S[i]=S[i]+S[j];
S[j]=S[i]-S[j];
S[i]=S[i]-S[j];
}
}
/*
生成密钥流
len:明文为len个字节
*/
void keyStream(int len);
};
void RC4::keyStream(int len) {
initial();
rangeS();
int i=0,j=0,t;
while(len--){
i=(i+1)%256;
j=(j+S[i])%256;
S[i]=S[i]+S[j];
S[j]=S[i]-S[j];
S[i]=S[i]-S[j];
t=(S[i]+S[j])%256;
(S[t]);
}
}
void RC4::encryption(const string &plaintext,const string &ks,const string &ciphertext) {
ifstream in;
ofstream out,outks;
(plaintext);
//获取输入流的长度
(0,ios::end);
int lenFile=();
(0, ios::beg);
/生产密钥流
keyStream(lenFile);
(ks);
for(int i=0;i<lenFile;++i){
outks<<(k[i]);
}
();
//明文内容读入bits中
unsigned char *bits=new unsigned char[lenFile];
((char *)bits,lenFile);
();
(ciphertext);
//将明文按字节依次与密钥流异或后输出到密文文件中
for(int i=0;i<lenFile;++i){
out<<(unsigned char)(bits[i]^k[i]);
}
<span style="white-space:pre"> </span>();
delete []bits;
}
解密类:
/*
解密类
*/
class RC4_decryption{
public:
/*
构造函数,参数为密钥流文件和密文文件
*/
RC4_decryption(const string ks,const string ct):keystream(ks),ciphertext(ct) {}
/*
解密方法,参数为解密文件名
void decryption(const string &);
private:
string ciphertext,keystream;
};
流密码与分组密码编程 来自淘豆网m.daumloan.com转载请标明出处.