#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#define N 50
void menu();/*显示菜单*/
char * inputPandK();/*输入明文和密钥*/
void caesar();/*恺撒加密算法*/
void vigenere();/*维吉尼亚加密算法*/
int main()
{
menu();
system("PAUSE");
return 0;
}
void menu()
{
int i=0;
printf(" Clssical encrption program: /n");
printf("****0-----------EXIT **** /n");
printf("****1-----------Keasar **** /n");
printf("****2-----------Vigenere **** /n");
printf("******************************* /n");
printf("Choose your option: ");
scanf("%d",&i);
switch(i)
{
case 0: break;
case 1: caesar();
break;
case 2: vigenere();
break;
default:break;
}
}
//输入明文和密钥
char* inputPandK()
{
char * plntxt;//声明一个明文指针类型
int i = 0,choose = 0;
//开辟一块内存空间
plntxt = (char *)malloc(N * sizeof(char));
if(plntxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
/*输入明文*/
printf("****Enter plaintext: /n");
fflush(stdin);
while(i < N)
{
plntxt[i] = getchar();
//如果输入不合法,跳出循环,最后一个元素赋值为空
if(plntxt[i] > 126 || plntxt[i] < 32)
{
plntxt[i] = '/0';
break;
}
else
i++;
}
//返回该数组首地址
return plntxt;
}
void caesar()
{
char* _plntxt;//明文指针
int* _cphrtxt;//密文指针
unsigned int i,j;
unsigned char key = 0;
//接收明文
_plntxt = inputPandK();
printf("Enter the key:");
scanf("%c",&key);
while(!isdigit(key))
{
//key = 0;
printf("Your input is error! /n");
printf("Enter the key again: /n");
scanf("%c",&key);
}
_cphrtxt = (int *)malloc(N * sizeof(int));
if(_cphrtxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
//keasar加密算法
for(i = 0;i < strlen(_plntxt);i++)
{
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
//直接转换为小写
_cphrtxt[i] = (_plntxt[i]%'A' + key)%26 + 'a';
else if(_plntxt[i] >= 'a' && _plntxt[i] <= 122)
//直接转换为大写
_cphrtxt[i] = (_plntxt[i]%'a' + key)%26 + 'A';
else
//如果为其他字符,则不变输出
_cphrtxt[i] = _plntxt[i];
}
//输出密文
printf("The ciphertext is :");
for(j = 0;j <= i;j++)
printf("%c",_cphrtxt[j]);
free(_plntxt);
free(_cphrtxt);
}
void vigenere()
{
char* _plntxt;
int* _cphrtxt;
char* key;
unsigned int i = 0,j;
//开辟密钥,密文空间
key = (char *)malloc(N * sizeof(char));
if(key == NULL)
{
printf("Memory location failed!");
exit(-1);
}
_cphrtxt = (int *)malloc(N * sizeof(int));
if(_cphrtxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
//接受明文
_plntxt = inputPandK();
printf("Enter the key: /n");
fflush(stdin);
while(i < N)
{
//
key[i%strlen(key)] = getchar();
if(key[i%strlen(key)] > 126 || key[i%strlen(key)] < 32)
{
key[i%strlen(key)] = '/0';
break;
}
else
i++;
}
for(i = 0;i < strlen(_plntxt);i++)
{ //密钥为大写字母
if(key[i%strlen(key)] >= 'A' && key[i%strlen(key)] <= 'Z')
{ //明文为大写字母
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
_cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'A')%26 + 'a';
//明文为小写字母
else if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')
_cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'a')%26 + 'A';
}
//密钥为小写
if(key[i%strlen(key)] >= 'a' && key[i%strlen(key)] <= 'z')
{ //明文为大写字母
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
_cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'A')%26 + 'a';
//明文为小写字母
if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')
_cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'a')%26 + 'A';
}
//如果为其他字符,则不变输出
if(key[i%strlen(key)] < 'A' || ((key[i%strlen(key)] > 'Z' && key[i%strlen(key)] < 'a')) || key[i%strlen(key)] > 'z')
_cphrtxt[i] = _plntxt[i];
}
//屏幕输出密文
printf("The ciphertext is :");
for(j = 0;j <= i;j++)
printf("%c",_cphrtxt[j]);
free(_plntxt);
free(_cphrtxt);
free(key);
}