📄 duobiaotidai.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 + -