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

📄 rc4.cpp

📁 在控制台下用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 + -