一、实验目的:
掌握凯撒加密解密算法,并学会实现凯撒加密解密
二、实验过程:
1. 学习凯撒加密解密的具体算法,想出对应的解题思路。其中对于此次试验凯撒加密解密均采用求模运算。以下C为密文,P为明文,key为密钥。
加密算法:C=P+key(mod 26)
解密算法:P=C-key(mod 26)
2.根据凯撒加密解密算法写出对应的程序代码,最后写出主函数对其进行调用。
3.运行并对此代码进行测试。
三、实验代码及结果:
(1)实验代码:
#include <stdio.h>
#include <string.h>
void kaisa_jiami(int key,char P[1000]){ //凯撒加密
int i; //定义i
char C[1000]; //C为密文,定义密文字符串长度为1000
for(i=0;i<strlen(P);i++){ //循环遍历输入的字符串P
if(P[i]>='A'&&P[i]<='Z'){//当输入明文在A—Z之间时,依次对字母进行加密
C[i]=(P[i]+key-'A')%26+'A'; //执行加密算法:C=P+key(mod 26)
}
else if(P[i]>='a'&&P[i]<='z'){ //当输入明文在a—z之间时,依次对字母进行加密
C[i]=(P[i]+key-'a')%26+'a'; //执行加密算法:C=P+key(mod 26)
}
else C[i]=P[i]; //当输入的明文为空格或其他字符时,不对明文进行加密处理
}
C[i]='\0'; //字符串结束
printf("加密后密文为:%s\n",C); //输出加密后的密文
}
void kaisa_jiemi(int key,char C[1000]){ //凯撒解密
int i; //定义i
char P[1000];//P为明文,定义明文字符串长度为1000
for(i=0;i<strlen(C);i++){ //循环遍历输入的字符串C
if(C[i]>='A'&&C[i]<='Z'){//当输入明文在A—Z之间时,依次对字母进行解密
P[i]=((C[i]-'A')+26-key)%26+'A'; //执行解密算法:P=C-key(mod 26)
}
else if(C[i]>='a'&&C[i]<='z'){ //当输入明文在a—z之间时,依次对字母进行解密
P[i]=((C[i]-'a')+26-key)%26+'a'; //执行解密算法:P=C-key(mod 26)
}
else P[i]=C[i]; //当输入的密文为空格或其他字符时,不对密文进行解密处理
}
P[i]='\0'; //字符串结束
printf("解密后明文为:%s\n",P); //输出“解密后的明文”
}
int main(){ //主函数
int key,a; //key值为秘钥,其中key的有效值为0~25。a值用于判断加密还是解密
char P[1000],C[1000]; //定义明文P,密文C
printf("请输入Key值:"); //输出“请输入Key值:”
scanf("%d",&key); //输入key值
printf("请选择加密还是解密,加密为1,解密为2:\n");
//输出“请选择加密还是解密,加密为1,解密为2:”
scanf("%d",&a); //输入a值
if(a==1){ //如果输入的a值为1,则执行加密
printf("请输入加密的明文:"); //输出“请输入加密的明文:”
getchar(); //用来消除回车符,以免出现闪退
gets(P); //输入明文P
kaisa_jiami(key,P); //根据输入的key值和明文P调用加密函数kaisa_jiami
}
else if(a==2){ //如果输入的a值为1,则执行加密
printf("请输入解密的密文:"); //输出“请输入解密的密文:”
getchar(); //用来消除回车符,以免出现闪退
gets(C); //输入密文C
kaisa_jiemi(key,C); //根据输入的key值和密文C调用解密函数kaisa_jiemi
}
else{
printf("输入错误!!!\n");//如果输入其他数值,则输出“输入错误!!!”,结束程序
}
}
(2)实验结果: