维吉尼亚密码
结构简单
随便发发
#include "stdafx.h"//在vs调试的需要加入这个和ws2_32.lib
#include <stdlib.h>//stdlib 头文件里包含了C、C++语言的最常用的系统函数,该文件包含了的C语言标准库函数的定义
#include <stdio.h>// 标准输入输出函数库
#include <string.h> //在使用到字符数组时需要使用
#define N 10000//可运算100长度的密码 /*考虑内存的话要改*/
void Pan(char str[]);//判断合法的函数
void Pan1(char str[]);//判断合法的函数
void jiami(char m[],char key[]);//声明加密函数
void jiemi(char s[],char key[]);//声明解密函数
void geshihua(char str[]);//声明格式化函数
int main(){//主函数
char choose;//功能选择的变量
char m[N]; //明文数组
char key[N]; //密钥数组
char s[N];//密文 数组
int len_k=strlen(key);//密钥长度,类型int,整形
for(;;){//控制循环,输入退出
printf("请选择功能(功能键不区分大小写)\n加密1\n解密2\n退出3\n");
scanf("%s",&choose);//功能输入
getchar();//清空上一步的回车 防止下面puts无法计算
if(choose=='1'){
printf("输入明文:");
gets(m);//获取明文
Pan1(m);//判断 he fa ?
printf("输入密钥:");
gets(key);//输入密钥
Pan(key);
puts(key);
geshihua(key);//改密钥格式
printf("密文:");
jiami(m,key);//调用加密函数
continue;}
else if(choose=='2'){
printf("输入密文:");
gets(s);//接受密文
Pan1(s);
printf("输入密钥:");
gets(key);//接受密钥
Pan(key);
geshihua(key);//格式化密钥
printf("明文:");
jiemi(s,key);//调用解密函数
continue;}
else if(choose=='3'){
printf("已经退出!\n");
exit(0);//退出功能
}
else {
printf("输入错误!\n");
continue;
}
}//for结束
}
void jiami(char m[],char key[])//加密函数
{
int i,j;//i,j控制循环,j控制key的轮回,
int len_k=strlen(key);//密钥长度
char s[N];//密文接受组
for(i=0,j=0;m[i]!='\0';i++){
if(m[i]==32){//判断空格
s[i]=' ';
}
else if(m[i]>='A'&&m[i]<='Z'){//if 是大写
s[i]=((int)(m[i]-'A')+(int)(key[j%len_k]-'A'))%26+65;//加密算法 ,放入结果s
j++;
}
else if(m[i]>='a'&&m[i]<='z'){//如果是小写
s[i]=((int)(m[i]-'a')+(int)(key[j%len_k]-'A'))%26+97;//加密算法 ,放入结果s
j++;
}
printf("%c",s[i]); //输出密文
}
printf("\n");//打出回车
}
void Pan(char str[]){//kong ge
int i;
int j=0;
for(i=0;str[i]!='\0';i++){
if(str[i]!=' '){
str[j++]=str[i];
}
}
}
void Pan1(char str[]){
int i;
for(i=0;str[i]!='\0';i++) { //在26字母,' '
if(int(str[i])!=32&&int(str[i])<65||int(str[i])>90&&int(str[i])<97||int(str[i])>122)//判断输入的东西合法码
{
printf("输入格式不正确,请您重新输入\n");
exit(0); }
}
}
void geshihua(char str[])//格式化函数
{
int i;
for(i=0;str[i]!='\0';i++){
if(str[i]>='a'&&str[i]<='z'){
str[i]=str[i]-32;//改大写
}
else if (str[i]>='A'&&str[i]<='Z'){
str[i]=str[i];
}
}
}
void jiemi(char s[],char key[])//解密函数
{
int i,j;//i,j控制循环,j控制key的轮回,
int len_k=strlen(key);//密钥长度
char q[N];//密文接受组
for(i=0,j=0;s[i]!='\0';i++){
if(s[i]==32){//判断空格
q[i]=' ';
}
else if(s[i]>='A'&&s[i]<='Z'){//if 是大写
q[i]=((int)(s[i]-'A')-(int)(key[j%len_k]-'A')+26)%26+65;//加密算法 ,放入结果s
j++;
}
else if(s[i]>='a'&&s[i]<='z'){//如果是小写
q[i]=((int)(s[i]-'a')-(int)(key[j%len_k]-'A')+26)%26+97;//加密算法 ,放入结果s
j++;
}
printf("%c",q[i]); //输出密文
}
printf("\n");//打出回车
}