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

📄 duobiaotidai.cpp

📁 一个周期3的多表代替密码
💻 CPP
字号:
//032223 Chen Chao

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>

unsigned char *full_array2(int n){//公式法产生的一个替代表
	int m,i,j,k,l=0,flag;
	static unsigned char p[256];

start:
	printf("\n请输入不小于%d的所用随机个数\n",n+1);
	scanf("%d",&m);//输入不小于25的数字
	if(m<=n){
		printf("\n输入数%d比%d小,需重新输入!\n",m,n+1);
		goto  start;
	}//不符合的情况
	srand((unsigned)time(NULL));
	for(i=0;i<m;i++){
		p[l++]=(unsigned char)(rand()%(n+1));//生成m个随机数模26存入数组p
		for(j=0;j<l-1;j++){
			if(p[j]==p[l-1]){
				l--;
				break;
			}
		}//如有重复长度减一
	}
	k=l;
	for(i=0;i<=n;i++){
		flag=0;//置标志位为零
		for(j=0;j<k;j++)
			if(p[j]==i){
				flag=1;
				break;
			}
		if(!flag){
			p[l]=i;
			l++;
		}
	}
	for(i=n;i<=m;i++)
		printf("%d",p[i]);
	return p;//返回数组p
}


int letter_to_digit(char c){//将输入的26个字母转换为数字0--25
	int i;
	char alphabet[26]={"abcdefjklmnopqrstuvwxyz"};
	for(i=0;i<26;i++)
		if(tolower(c)==alphabet[i])return(i);
	return(-1);
}


char digit_to_letter(int n){//将数字转换为对应的26个英文字母
	char alphabet[26]={"abcdefjklmnopqrstuvwxyz"};
	if(n<0||n>25)
		return(0);
	return(alphabet[n]);
}


unsigned char*KeyGen_s(){//密钥字法产生一代替密码表
	char KeyWords[106];//定义密钥字
	char ChoiceWords[26];
	unsigned char*p;
	static unsigned char KeyTab[26*3];
	int i,j,k,l;

	printf("\n请输入密钥字:\n");
	gets(KeyWords);//从键盘得到密钥字
	strcat(KeyWords,"abcdefghijklmnopqrstuvwxyz");
	k=0;
	l=strlen(KeyWords);//l=密钥字长
	ChoiceWords[k]=tolower(KeyWords[0]);//先置ChoiceWords=0

	for(i=1;i<l;i++){
		if(letter_to_digit(KeyWords[i])==-1) continue;
		ChoiceWords[++k]=tolower(KeyWords[i]);//ChoiceWords存入KeyWords的字母
		for(j=0;j<k;j++)
			if(ChoiceWords[j]==ChoiceWords[k]){//若密钥中有相同的密钥字跳出
				k--;
				break;
			}
	}

	for(i=0;i<26;i++)
		KeyTab[i]=(unsigned char)letter_to_digit(ChoiceWords[i]);//把ChoiceWords中的数字转换为对应字母放入KeyTab
	p=full_array2(25);//p调用函数full_array2
	for(i=0;i<26;i++)
		KeyTab[52+i]=(unsigned char)((7*i+3)%26);
	return(KeyTab);
}


void Encrypt_s(unsigned char*key){//子函数
	int i;
	FILE*fp;
	char filename[20],c;

start:
	printf("\n请输入待加密文本文件名:\n");
	scanf("%s",filename);//从键盘得到待加密文件名 
	if((fp=fopen(filename,"rt"))==NULL){
		printf("没有找到文件:%s\n",filename);
		goto start;
		}//找不到文件的情况
	printf("\n密文如下:\n");
	i=0;
	while((c=fgetc(fp))!=EOF){
		if(letter_to_digit(c)==-1){
			putchar(c);
			continue;
		}
	isupper(c)?putchar(toupper(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]))):
		putchar(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]));
	i++;
	if(i>=26*3)i=0;
	}//输出密文
	fclose(fp);
}

void main(){
	unsigned char*p;
	p=KeyGen_s();
	Encrypt_s(p);
}

⌨️ 快捷键说明

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