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

📄 traditionalcode.c

📁 古典密码算法中的单表代换密码算法、移位密码算法、Vigenere密码算法。算法比较简单
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
#define KLEN 2048
#define TLEN 2048
void HelpMessage()
{
	printf("Traditonal Encrypt Algorithm.\n");
	printf("Copyright: copyright (C) 2009 肖庆平.\n");
	printf("All Right Reserved!!!");
	printf("\n");
	printf("\n");
	printf("Command List:\n");
	printf("[1] -gp <plain filename>: \n");
	printf("    generate a plain text.\n");
	printf("[2] -sink <key filename>: \n");
	printf("    generate a single table key.\n");
	printf("[3] -sftk <key filename>: \n");
	printf("    generate a shift key.\n");
	printf("[4] -vik <key filename>: \n");
	printf("    generate a vigenere key.\n");
	printf("[5] -sin <plain filename> <key filename> <cipher filename>: \n");
	printf("    select the single table algorithm\n");
	printf("[6] -sft <plain filename> <key filename> <cipher filename>: \n");
	printf("    select the shift algorithm\n");
	printf("[7] -vi <plain filename> <key filename> <cipher filename>: \n");
	printf("    select the vigenere algorithm\n");
}
void SuccessMessage()
{
	printf("\n");
	printf("\n");
	printf("Traditonal Encrypt Algorithm.\n");
	printf("Copyright: copyright (C) 2009 肖庆平.\n");
	printf("All Right Reserved!!!");
	printf("\n");
	printf("\n");
}
void RandomPlain(char * filename)
{
	FILE *fp;
	int plainsize;
	int i;
	char plainchar;
	fp=fopen(filename,"w");
	srand((unsigned)time(NULL));

	plainsize=rand()%TLEN+1;
	
	for(i=0; i<plainsize; ++i)
	{
		plainchar=rand()%26+'a';
	    fprintf(fp, "%c",plainchar);
	}
	SuccessMessage();
	printf("Success in get the plaintext in %s.\n",filename);
}

void RandomSingleKey(char *filename)
{
	FILE *fp;
	int keysize;
	int i;
	char keychar;
	fp=fopen(filename,"w");
	srand((unsigned)time(NULL));
	keysize=rand()%KLEN+1;
	
	for(i=0; i<keysize; ++i)
	{
		keychar=rand()%26+'a';
		fprintf(fp, "%c",keychar);
	}
	SuccessMessage();
	printf("Success in get the key in %s.\n",filename);
}

void RandomShiftKey(char *filename)
{
	FILE *fp;
	int i;
	fp=fopen(filename,"w");
	srand((unsigned)time(NULL));
	i=rand()%26;
	fprintf(fp, "%d",i);
	SuccessMessage();
	printf("Success in get the key in %s.\n",filename);
}
void RandomVigenereKey(char *filename)
{
	FILE *fp;
	int keysize;
	int i;
	char keychar;
	fp=fopen(filename,"w");
	srand((unsigned)time(NULL));
	keysize=rand()%10;
	
	for(i=0; i<keysize; ++i)
	{
		keychar=rand()%26+'a';
		fprintf(fp, "%c",keychar);
	}
	SuccessMessage();
	printf("Success in get the key in %s.\n",filename);
}
void singletable(char *plain,char *key,char *cipher)
{
	FILE *fplain,*fpkey,*fpcipher;
  char *keystr,*plainstr,*cipherstr;
	char *alp="abcdefghijklmnopqrstuvwxyz";
	int keylen,textlen;
	int i,j,k;
	keystr=(char *)malloc(KLEN);
	plainstr=(char *)malloc(TLEN);
	cipherstr=(char *)malloc(TLEN);
	if((fpkey=fopen(key,"r"))==NULL)
	{
		printf("Cannot open the key file.\n");
		exit(0);
	}
	if((fplain=fopen(plain,"rb"))==NULL)
	{
		printf("Cannot open the plain file.\n");
		exit(0);
	}
	if((fpcipher=fopen(cipher,"wb"))==NULL)
	{
		printf("Cannot open the cipher file.\n");
		exit(0);
	}
	fgets(keystr,KLEN-1,fpkey);
	fputs("<html>\n",fpcipher);
    fputs("<head>\n",fpcipher);
	fputs("<title>您选择的算法是单表代换密码算法</title>\n",fpcipher);
	fputs("</head>\n",fpcipher);
	fputs("\n",fpcipher);
	fputs("</body>\n",fpcipher);
	fputs("<caption><h2 align=center>单表加密结果</h2></caption>\n",fpcipher);
	fputs("<font size=5>您输入的密钥为:</font><br>",fpcipher);
	fprintf(fpcipher,keystr);
	fputs("\n<br>",fpcipher);
	keystr=strcat(keystr,alp);
	keylen=strlen(keystr);
	
	

	
	for(i=0;i<keylen;i++)     //密钥转换
	{
		for(j=i+1;j<keylen;j++)
		{
			if(keystr[j]==' '||keystr[j]==keystr[i])
			{
				for(k=j;k<keylen;k++)
				{
					keystr[k]=keystr[k+1];
				}
				j--;
				keylen--;
			}
		}
	}
	fputs("<font size=5>密钥转换表:</font><br>",fpcipher);
	fputs("\n",fpcipher);
	fprintf(fpcipher,alp);
	fputs("\n<br>",fpcipher);
	fprintf(fpcipher,keystr);
	fputs("\n",fpcipher);
	//printf("%d",keylen);
	//puts(keystr);
	fputs("<div align=center>\n",fpcipher);
	fputs("<br><br>\n",fpcipher);
	fputs("<table border=2 width=70% height=50%>\n",fpcipher);
	fputs("<caption><h2 align=center>明文密文对照表</h2></caption>\n",fpcipher);

	fgets(plainstr,TLEN+1,fplain);
	
	fputs("<tr>\n<th>明文</th><th>密钥</th><th>密文</th>\n</tr>\n",fpcipher);

	
	textlen=strlen(plainstr);

	for(i=0;i<textlen;i++)
	{
		if(plainstr[i]==' ')
			cipherstr[i]=' ';
		else for(j=0;j<26;j++)
		{
			if(plainstr[i]==alp[j])
			{
				cipherstr[i]=keystr[j];
			}
		}
		fputs("<tr>\n<th>\n",fpcipher);
		fputc(plainstr[i],fpcipher);
		fputs("</th>\n<th>\n",fpcipher);
		fputc(keystr[i%26],fpcipher);
		fputs("</th>\n<th>\n",fpcipher);
		fputc(cipherstr[i],fpcipher);
		fputs("</th>\n</tr>\n",fpcipher);

	}
	fputs("</table>\n</div>\n</body>\n</html>\n",fpcipher);

	fclose(fplain);
	fclose(fpkey);
	fclose(fpcipher);
	SuccessMessage();
	printf("Encrypt Success!!!\n");
}
void shift(char *plain,char *key,char *cipher)
{
	FILE *fplain,*fpkey,*fpcipher;
  char *plainstr,*cipherstr;
	int keystr;
	char *circle_alp;
	char *alp="abcdefghijklmnopqrstuvwxyz";
	int textlen;
	int i,j;
	circle_alp=(char *)malloc(27);
	plainstr=(char *)malloc(TLEN);
	cipherstr=(char *)malloc(TLEN);
	if((fpkey=fopen(key,"r"))==NULL)
	{
		printf("Cannot open the key file.\n");
		exit(0);
	}
	if((fplain=fopen(plain,"rb"))==NULL)
	{
		printf("Cannot open the plain file.\n");
		exit(0);
	}
	if((fpcipher=fopen(cipher,"wb"))==NULL)
	{
		printf("Cannot open the cipher file.\n");
		exit(0);
	}
	//keystr=getw(fpkey);
	fscanf(fpkey,"%d",&keystr);
	printf("%d",keystr);
	fputs("<html>\n",fpcipher);
    fputs("<head>\n",fpcipher);
	fputs("<title>您选择的算法是移位密码算法</title>\n",fpcipher);
	fputs("</head>\n",fpcipher);
	fputs("\n",fpcipher);
	fputs("</body>\n",fpcipher);
	fputs("<caption><h2 align=center>移位加密结果</h2></caption>\n",fpcipher);
	fputs("<font size=5>您输入的密钥为:</font><br>",fpcipher);
	fprintf(fpcipher,"%d",keystr);
	fputs("\n<br>",fpcipher);

	fputs("<font size=5>密钥转换表:</font><br>",fpcipher);
	fputs("\n",fpcipher);
	fputs(alp,fpcipher);
	fputs("\n<br>",fpcipher);

	for(i=0;i<26;i++)
	{
		circle_alp[i]=alp[i]+keystr;
		if(circle_alp[i]>122)
		{
			circle_alp[i]=circle_alp[i]-26;
		}
		//cout<<circle_alp[i];
		fputc(circle_alp[i],fpcipher);
	}
    
	
	fputs("\n",fpcipher);

	fgets(plainstr,TLEN-1,fplain);


	textlen=strlen(plainstr);

	fputs("<div align=center>\n",fpcipher);
	fputs("<br><br>\n",fpcipher);
	fputs("<table border=2 width=70% height=50%>\n",fpcipher);
	fputs("<caption><h2 align=center>明文密文对照表</h2></caption>\n",fpcipher);
	fputs("<tr>\n<th>明文</th><th>密文</th>\n</tr>\n",fpcipher);
	for(i=0;i<textlen;i++)
	{
		if(plainstr[i]==' ')
		{
			cipherstr[i]=' ';
		}
		else for(j=0;j<26;j++)
		{
			if(plainstr[i]==alp[j])
				cipherstr[i]=circle_alp[j];
		}
	    fputs("<tr>\n<th>\n",fpcipher);
		fputc(plainstr[i],fpcipher);
		fputs("</th>\n<th>\n",fpcipher);
		fputc(cipherstr[i],fpcipher);
		fputs("</th>\n</tr>\n",fpcipher);
	}
	fclose(fplain);
	fclose(fpkey);
	fclose(fpcipher);
	SuccessMessage();
	printf("Encrypt Success!!!\n");
}
void vigenere(char *plain,char *key,char *cipher)
{
	FILE *fplain,*fpkey,*fpcipher;
    char *keystr,*plainstr,*cipherstr;
	int keylen,textlen;
	int i,j,k;
	int Change[10];
	int flag=0;
	keystr=(char *)malloc(10);
	plainstr=(char *)malloc(10);
	cipherstr=(char *)malloc(10);
	if((fpkey=fopen(key,"r"))==NULL)
	{
		printf("Cannot open the key file.\n");
		exit(0);
	}
	if((fplain=fopen(plain,"rb"))==NULL)
	{
		printf("Cannot open the plain file.\n");
		exit(0);
	}
	if((fpcipher=fopen(cipher,"wb"))==NULL)
	{
		printf("Cannot open the cipher file.\n");
		exit(0);
	}
	fgets(keystr,11,fpkey);
	keylen=strlen(keystr);
	for(i=0;i<keylen;i++)
	{
		for(j=i+1;j<keylen;j++)
		{
			if(keystr[j]==' ')
			{
				for(k=j;k<keylen;k++)
				{
					keystr[k]=keystr[k+1];
				}
				j--;
				keylen--;
			}
		}
	}
	for(i=0;i<keylen;i++)
	{
		if(keystr[i]>='A'&&keystr[i]<='Z')
		{
			Change[i]=(int)(keystr[i]-'A');
		}
		else if(keystr[i]>='a'&&keystr[i]<='z')
		{
			Change[i]=(int)(keystr[i]-'a');
		}
	//	printf("%d",Change[i]);
	}
	fgets(plainstr,11,fplain);
	textlen=strlen(plainstr);
	k=0;
	for(i=0;i<textlen;i++)
	{
		if(plainstr[i]==' ')
			flag++;
		//continue;
		else
		{
			cipherstr[k]=(char)(((int)plainstr[i]+Change[k%keylen]-'a')%26+'a');
			k++;
		}
	}
	for(i=0;i<textlen-flag;i++)
	{
		fputc(cipherstr[i],fpcipher);
	}
	fclose(fplain);
	fclose(fpkey);
	fclose(fpcipher);
	SuccessMessage();
	printf("Encrypt Success!!!\n");
}
void main(int argc,char *argv[])
{
   if(argc==1)
	{
		HelpMessage();
	}
	else
	{
		if(argc==3 && strcmp(argv[1],"-gp")==0)
		{
			RandomPlain(argv[2]);
		}
		else if(argc==3 && strcmp(argv[1],"-sink")==0)
		{
			RandomSingleKey(argv[2]);
		}
		else if(argc==3 && strcmp(argv[1],"-sftk")==0)
		{
			RandomShiftKey(argv[2]);
		}
		else if(argc==3 && strcmp(argv[1],"-vi")==0)
		{
			RandomVigenereKey(argv[2]);
		}
		else if(argc==5 && strcmp(argv[1],"-sin")==0)
		{
			singletable(argv[2],argv[3],argv[4]);
		}

		else if(argc==5 && strcmp(argv[1],"-sft")==0)
		{
			shift(argv[2],argv[3],argv[4]);
		}

		else if(argc==5 && strcmp(argv[1],"-vi")==0)
		{
			vigenere(argv[2],argv[3],argv[4]);
		}

		else
		{
			printf("Invalid Command!!!");
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -