让我们选一个英文短语, 称其为密钥字(key word)或密钥短语(key phrase),如HAPPY NEWYEAR,按顺序去掉重复字母和空格得HAPYNEWR。将它依次写在明文字母表之下, 而后再将明文字母表中未在短语中出现过的字母依次写在此短语之后, 就可构造出一个代替表, 如下所示:
明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:HAPYNEWRBCDFGIJKLMOQSTUVXZ
请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表(即上面的那个表),然后可以对用户输入的明文进行加密。
输入样例:
明文:ILoveHuiwen
输出样例:
密文:BFjtnRsbuni
#include
#include
#include
char* mishi(char a[], char b[]);//设置一个函数用来改变密匙.
char* duizhaobiao(char a);//得到对照表
char miwen(char a[], char b[]);
int main()
{
char ch1[50];
char ch[100];
char ch2[27];
gets(ch);//输入密匙
char p = mishi(ch, ch1);//得到密匙
char *p1 = duizhaobiao(p);
strcpy(ch2, p);
strcat(ch2, p1);
printf("该表是对应表%s", ch2);
printf("请输入明文\n");
char in[100];
gets(in);
miwen(ch2, in);
getch();
return 0;
}
char mishi(char a[], char b[])
{
for (int i = 0; i <= strlen(a); i++)
{
for (int j = 0; j <= strlen(a); j++)
if (a[i] == a[j] && i != j)
a[j] = ' ';
}
int j = 0;
for (int i = 0; i <= strlen(a); i++)//处理空格
{
if (a[i] != ' ')
{
b[j] = a[i];//用另一个数组保持密匙
j++;
}
else
continue;
}
b[j] = '\0';//使数组b成为字符串。
return b;
}
char* duizhaobiao(char a[])
{
char ch1[26] = { 0 };//初始化全为0,对照字母表只要重复为1.
char ch2[25];
for (int i = 0; i < strlen(a); i++)
{
int j = 0;
for (char ch = 'A'; ch <= 'Z'; ch++)
{
if (a[i] == ch)
ch1[j]++;//参考桶排法.
else
j++;
}
}
char ch = 'A';
int b = 0;
for (int i = 0; i < 26; i++)
{
for (int j = 0; j >= ch1[i]; j--)
{
ch2[b] = ch;
b++;
}
ch++;
}
ch2[b] = '\0';
return ch2;
}
char* miwen(char a[], char b[])
{
for (int i = 0; i <= strlen(b); i++)
{
int j = 0;
for (char ch1 = 'A'; ch1 <= 'Z'; ch1++)
if (b[i] == ch1)
{
printf("%c", a[j]);
}
else
j++;
}
}
记住只能大写,如果需要小写使用头文件
#include
#include
int main()
{
int a,b,c,d,e,f,g;
char surface[1000]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char secret[1000];
gets(secret);
strupr(secret);
strcat(secret,surface);
for(f=0;f<strlen(secret);f++)
if(secret[f]==' ')
{for(g=f;g<strlen(secret);g++)
{
secret[g]=secret[g+1];
}
g--;
}
for(a=0;a<strlen(secret);a++)
for(b=a+1;b<=strlen(secret);b++)
{
if(secret[a]==secret[b])
{
for(c=b;c<strlen(secret);c++)
secret[c]=secret[c+1];
b--;
}
}
printf("%s\n%s\n",surface,secret);
char give[100];
char Fsurface[100];
char Fsecret[100];
strcpy(Fsurface,strlwr(surface));
strcpy(Fsecret,strlwr(secret));
strcat(Fsecret,strupr(surface));
strcat(Fsecret,strupr(secret));
scanf("%s",give);
for(d=0;d<=strlen(give);d++)
for(e=0;e<=strlen(Fsurface);e++)
{
if(give[d]==Fsurface[e])
printf("%c",Fsecret[e]);
}