开学回来后,已经是大三后半年,同学们都忙着考证,一直复习都是操作系统和计算机组成原理。上网络安全时候老师布置了三道古典加密算法。我也希望和大家一起分享,有什么不对之处望指出。
(1)凯撒加密算法
I.对于字母表str[ ]a,b,c.....z(本例只考虑小写,你也可以改大小写的)换算成0,1,2...25个数组A[ ](简单的数组映射关系),即:str[i]=A[j],i=j;
(2)选取秘钥,输入key(0-25)
(3)则明文M转换成密文C公式就是
C=E(m);
C=(m+key)%26
我的代码实现:其中我没有用映射,映射关系比较直观并且清晰,乘法和仿射会用到
#include<stdio.h>
#define M 20
static int flag=1;
void swapCh(char *str,const int key ,int sum);
void jie(char *str,const int key,int sum);
void main()
{
char str[M],ch='1';
int i=0,sum=0,key;
printf("输入明码的字母数字*结束或者最大为20\n");
while((i<20)&&ch!='*')//此处不考虑换行,也可加上,自己试试就知道了,你也能加if判断来剔除'\n'
{
scanf("%c",&ch);
str[i]=ch;
i++;
}
sum=i-1;
//明文输出检查
for(i=0;i<sum;i++)
printf("%c",str[i]);
printf("\n");
printf("enter the key(0-26)");
scanf("%d",&key);
swapCh(&str[0],key,sum);
for(i=0;i<sum;i++)
printf("%c",str[i]);
printf("\n");
if(flag)
{
jie(str,key,sum);
for(i=0;i<sum;i++)
printf("%c",str[i]);
printf("\n");
}
}
void swapCh(char *str,const int key ,int sum)
{
int k;
if(key<=26&&key>0)
{
printf("correct it is working\n");
for(k=0;k<sum;k++){
if((str[k]+key)%'z'==0)
str[k]='z';
else if((str[k]+key)%'z'<'a')
str[k]=(str[k]+key)%'z'+'a'-1;
else
str[k]=(str[k]+key)%'z';
}
}
else{
printf("it is wrong\n");
flag=0;
}
}
void jie(char *str,const int key,int sum)
{
int k=0;
printf("correct it is working\n");
for(k;k<sum;k++){
if((str[k]-key)>='a')
str[k]=str[k]-key;
else
str[k]='z'-'a'+str[k]-key+1;
}
}