/*
RC4加密解密
流密码是使用较短的一串数字(密钥)来生成无限长的伪随机密钥流,然后将密钥流和明文异或,
解密就是将密钥流和密文进行异或。
程序摘自《Windows C/C++加密解密实战》,有点点修改。
*/
#include <iostream>
#include<stdio.h>
#define MAX_CHAR_LEN 100000
void producekeystream(int textlength,unsigned char key[],int keylength,unsigned char keystream[])
{
unsigned int S[256];
int i,j=0,k;
unsigned char tmp;
for(i=0;i<256;i++)
S[i]=i;
for(i=0;i<256;i++)
{
j=(j+S[i]+key[i%keylength])%256;
tmp=S[i];
S[i]=S[j];
S[j]=tmp;
}
i=j=k=0;
while(k<textlength)
{
i=(i+1)%256;
j=(j+S[i])%256;
tmp=S[i];
S[i]=S[j];
S[j]=tmp;
keystream[k++]=S[(S[i]+S[j])%256];
}
}
void rc4encdec(int textlength,unsigned char plaintext[],unsigned char keystream[],unsigned char ciphertext[])
{
int i;
for(i=0;i<textlength;i++)
{
ciphertext[i]=keystream[i]^plaintext[i];
}
}
int main(int argc,char *argv[])
{
unsigned char plaintext[MAX_CHAR_LEN]; //存放源明文
unsigned char chktext[MAX_CHAR_LEN]; //存放解密后的明文
unsigned char key[32]; //存放用户输入密钥
unsigned char keystream[MAX_CHAR_LEN]; //存放生成的密钥流
unsigned char ciphertext[MAX_CHAR_LEN];//存放加密后的密文
unsigned c;
int i=0,textlength,keylength;
FILE *fp;
if((fp=fopen("mingwen.xls","rb"))==NULL)
{
printf("err mingwen");
return 0;
}
while((c=getc(fp))!=EOF)
plaintext[i++]=c;
textlength=i;
fclose(fp);
printf("password:");
for(i=0;(c=getchar())!='\n';i++)
key[i]=c;
key[i]='\0';
keylength=i;
producekeystream(textlength,key,keylength,keystream);//使用key生成一个keystream
rc4encdec(textlength,plaintext,keystream,ciphertext);//使用密钥流和明文生成密文
fp=fopen("miwen.xls","wb");
for(int i=0;i<textlength;i++)
putc(ciphertext[i],fp);
fclose(fp);
rc4encdec(textlength,ciphertext,keystream,chktext);
fp=fopen("jiemiwen.xls","wb");
for(int i=0;i<textlength;i++)
putc(chktext[i],fp);
fclose(fp);
return 0;
}