📄 rc4.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//注意实参要改变须用指针变量作为函数参数
void Swap(unsigned char *a,unsigned char *b)
{
//指针*a和指针*b互换,即S[i]S[j]互换
unsigned char temp;//用一个临时变量来做中间值
temp=*a;
*a=*b;
*b=temp;
}
int main(int argc,char *argv[])
{
if(argc!=5)
{
printf("输入命令行有误!\n");
printf("请输入如下格式:RC4 -e/-d key infile outfile\n");
}
//初始化密钥和加解密文件名
char K[256]=" ",infile[256]=" ",outfile[256]=" ";
char a[]="RC4",b[]="-e",c[]="-d";
int keylen;
strcpy(K,argv[2]);
strcpy(infile,argv[3]);
strcpy(outfile,argv[4]);
keylen=strlen(K);
//初始化S
unsigned char S[256];
unsigned char T[256];
for(int i=0;i<256;i++)
{
S[i]=i;
T[i]=K[i%keylen];
}
int j=0;
unsigned char *ptr1,*ptr2;
for(int i=0;i<256;i++)
{
j=(j+S[i]+T[i])%256;
ptr1=&S[i];
ptr2=&S[j];
Swap(ptr1,ptr2);
}
FILE *in,*out;
if((in=fopen(infile,"rb"))==NULL)
{
printf("\n不能打开文件!");
exit(0);
}
if((out=fopen(outfile,"wb"))==NULL)
{
printf("\n可能您还未创建文件!");
exit(0);
}
char ch1;
unsigned char ch2;
ch1=fgetc(in);
int m=0,n=0;
unsigned char *ptr3,*ptr4,k,k2,t;
//参数或者为加密“-e”或者为解密“-d”
if(((argc==5&&(strcmp(argv[0],a))==0&&(strcmp(argv[1],b))==0))==0
||((argc==5&&(strcmp(argv[0],a))==0&&(strcmp(argv[1],c))==0))==0)
{
while(!feof(in))
{
ch2=(unsigned char)ch1;
ch1=fgetc(in);
m=(m+1)%256;
n=(n+S[m])%256;
ptr3=&S[m];
ptr4=&S[n];
Swap(ptr3,ptr4);
t=(S[m]+S[n])%256;
k=S[t];//密钥流的产生
k2=k^ch2;
fputc(k2,out);
}
fclose(in);
fclose(out);
printf("加解密成功!");
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -