要求
(1) 字母和数字的对应,计算结果取模26的最小非负完全剩余系的数a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z ,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
(2) 加密方法即明文和密钥对应相加,密钥取完后又从头开始
代码
#include <stdio.h>
#include<cstring>
#include <cstdlib>
//加密
void encrypt()
{
int a,b,i=0,j=0;
char x[100],k[10],y[100];
printf("请输入消息:");
gets(x);
printf("\n");
printf("请输入密钥:");
gets(k);
printf("\n");
a=strlen(x);
b=strlen(k);
strlwr(k);
if(a>b)
{
for(i=0;i<a;i++)
{
y[i]=(x[i]+k[j]-97-97)%26+97;
printf("%c",y[i]);
j++;
if(j>=b)
{j=0;}
}
}
else
{
for(i=0;i<a;i++)
{
y[i]=(x[i]+k[j]-97-97)%26+97;
printf("%c",y[i]);
j++;
}
}
printf("\n");
}
//解密
void decrypt()
{
int a,b,i=0,j=0;
char x[100],k[10],y[100];
printf("请输入消息:");
gets(x);
printf("\n");
printf("请输入密钥:");
gets(k);
printf("\n");
a=strlen(x);
b=strlen(k);
strlwr(k);
if(a>b)
{
for(i=0;i<a;i++)
{
if(x[i]<97)
{
y[i]=(x[i]-(k[j]-32)+26)%26+65;
printf("%c",y[i]);
}else
{
y[i]=(x[i]-k[j]+26)%26+97;
printf("%c",y[i]);
}
j++;
if(j>=b)
{j=0;}
}
}
else
{
for(i=0;i<a;i++)
{
y[i]=(x[i]-k[j]+26)%26+97;
printf("%c",y[i]);
j++;
}
}
printf("\n");
}
int main()
{
int i;
list:printf("选择功能:\n1.加密 \n2.解密 \n3.结束\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1:encrypt();
goto list;
case 2:decrypt();
goto list;
case 3:exit(1);
}
}
运行结果
验证:
g u n d a m
6 20 13 3 0 12
k a m I a n l a I d a
10 0 12 8 0 13 11 0 8 3 0
C1=(6+10)mod26 = 16 -> q
C2=(20+0)mod26=20 -> u
C3=(13+12)mod26=25 -> z
C4=(3+8)mod26=11 -> l
C5=(0+0)mod26=0 -> a
C6=(12+13)mod26=25 ->z
加密完的密文为quzlaz与代码执行后一致。