课程名称: 密码技术 实验一
密码技术实验
实验项目:实验一,第一题
实验要求
(
)
实现维吉尼亚密码
实验环境
Win7 64位,Visual studio(c语言环境)
实现功能
实现功能:明文与密钥通过维吉尼亚密码算法加密,密文与密钥通过维吉尼亚密码算法解密。密钥大小写不敏感,输出明密文大小写转换。达到题目要求
数据结构
int caozuo;//用户选择加密/解密操作
char mingwen[100];//明文数组 char miwen[100];//密文数组 char miyue[100];//密钥数组
int len_miyue;//密钥长度 int len_miwen;//密文长度
程序流程
代码与代码分析
Function1: void encrypt(char mingwen[],char miyue[],char miwen[])//加密函数
Calls: strlen();//判断明文长度,密钥长度; puts();//输出密文,getchar();//接受回车
Called By: int main()//主函数调用
Input(type) :mingwen[100],char型;miyue[100],char型
Output(type):miwen[100],char型
Function2: void decrypt(char miwen[],char miyue[],char mingwen[])//解密函数
Calls: strlen();//判断密文长度,密钥长度; puts();//输出明文,getchar();//接受回车
Called By: int main()//主函数调用
Input(type) :miwen[100],char型;miyue[100],char型
Output(type):mingwen[100],char型
Others:密钥大小写不敏感
实验输入(可加截图):
结果输出(可加截图):
实验小结
1.数组初始化,即使在数组后面有输入,在声明后需要初始化,否则会在有效信息后输出现乱码。2.数组的输入输出。例如:scanf("%s",mingwen);puts(mingwen)。3.调用函数的声明。4.Main()函数中getchar()回收回车。
实验项目:实验一,第二题
实验要求
(内容)
单表替换密码
实验环境
Win7 64位,Visual studio(c语言环境)
实现功能
用户输入明文,输入26位不重复密钥,明文与密钥匹配得出密文。
明文与密钥通过单表替换加密,密文与密钥单表替换解密。
加密密钥大小写不敏感,输出明密文大小写转换;解密密钥大小写敏感,输入密钥只能与密文大小写相同。部分达到题目要求。
数据结构
int caozuo;//用户选择加密/解密操作
char mingwen[100];//明文数组 char miwen[100];//密文数组 char miyue[26];//密钥数组
int len_miwen;//密文长度 int count;记录密文在密钥中所在位置
程序流程
代码与代码分析
Function1: void encrypt(char mingwen[],char miyue[],char miwen[])//加密函数
Calls: strlen();//判断明文长度,密钥长度; puts();//输出密文,getchar();//接受回车
Called By: int main()//主函数调用
Input(type) :mingwen[100],char型
Output(type):miwen[100],char型
Function2: void decrypt(char miwen[],char miyue[],char mingwen[])//解密函数
Calls: strlen();//判断密文长度,密钥长度; puts();//输出明文,getchar();//接受回车
Called By: int main()//主函数调用
Input(type) :miwen[100],char型
Output(type):mingwen[100],char型
Others:密钥大小写不敏感
Bug:1.未判断输入密钥输入是否正确(位数,是否有重复,是否都为字母);
2.解密:密文与密钥需要大小写一致。
实验输入(可加截图):
结果输出(可加截图):
实验小结
解密算法需要先判断密文在密钥的具体位置,然后在明文顺序中找到相应位置。
再判断第二个密文位置时,需要把记录密文位置的变量清零。
维吉尼亚密码代码
// 维吉尼亚密码c.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include "stdio.h"
#include "string.h"
void encrypt(char[],char[],char[]);
void decrypt(char[],char[],char[]);
int main()
{
int caozuo;
char mingwen[100]="0";
char miwen[100]="0";
char miyue[100]="0";
printf("请选择加/解密操作:1加密,2解密:");
scanf("%d",&caozuo);
while((caozuo!=1)&&(caozuo!=2))//错误判断
{
printf("输入错误,请从新选择:");
scanf("%d",&caozuo);
}
if(caozuo==1){
printf("请输入您的明文:");scanf("%s",mingwen);
printf("请输入您的密钥:");scanf("%s",miyue);
encrypt(mingwen,miyue,miwen);
}
else if(caozuo==2)
{
printf("请输入您的密文:");scanf("%s",miwen);
printf("请输入您的密钥:");scanf("%s",miyue);
decrypt(miwen,miyue,mingwen);
}
getchar();//回收回车
}
void encrypt(char mingwen[],char miyue[],char miwen[])
{
int i,j,n,m,len_miyue,len_mingwen;
j=0;
len_miyue= strlen(miyue);
len_mingwen= strlen(mingwen);
for(i=0;i
='a' && mingwen[i]<='z'){//小写转大写
m=65;n=97;
if(miyue[j%len_miyue]>='A' && miyue[j%len_miyue]<='Z')//密钥为大写改为小写
miyue[j%len_miyue]=miyue[j%len_miyue]+32;
}
else if(mingwen[i]>='A' && mingwen[i]<='Z'){//大写转小写
m=97;n=65;
if(miyue[j%len_miyue]>='a' && miyue[j%len_miyue]<='z')//密钥为小写改为大写
miyue[j%len_miyue]=miyue[j%len_miyue]-32;
}
miwen[i]=(mingwen[i]-n+miyue[j%len_miyue]-n)%26+m;
j++;
}
printf("加密后的密文为:");
puts(miwen);
getchar();
}
void decrypt(char miwen[],char miyue[],char mingwen[])
{
int i,j,n,m,len_miyue,len_miwen;
j=0;
len_miyue= strlen(miyue);
len_miwen= strlen(miwen);
for(i=0;i='a' && miwen[i]<='z'){//小写转大写
m=65;
if(miyue[j%len_miyue]>='A' && miyue[j%len_miyue]<='Z'){
miyue[j%len_miyue]=miyue[j%len_miyue]+32;//密钥改为小写
}
}
else if(miwen[i]>='A' && miwen[i]<='Z'){//大写转小写
m=97;
if(miyue[j%len_miyue]>='a' && miyue[j%len_miyue]<='z') {
miyue[j%len_miyue]=miyue[j%len_miyue]-32;//密钥改为大写
}
}
mingwen[i]=(miwen[i]-miyue[j%len_miyue]+26)%26+m;
j++;
}
printf("解密后的明文为:");
puts(mingwen);
getchar();
}