jiami.cpp
来自「是关于恺撒加密解密」· C++ 代码 · 共 501 行
CPP
501 行
/*恺撒加密解密及字母表加密解密系统
使用Microsoft Visual C++ 实现
版本:1.1
QQ:88926860
*/
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
#include<string.h>
#include <conio.h>
#include "stdlib.h"
#define Ns 100
static int ckkey=1; //恺撒密钥
char zmkey[50];
static char zm[27]={"abcdefghijklmnopqrstuvwxyz"};
static char information[Ns]="";
static char key[50]; //存放加密减密密钥信息
//----------------去掉字符串前后连续空格 -->
char *trim(char *pStr)
{
int i = 0;
while(*(pStr+i) == ' '&&*(pStr+i)!='\0')
i++;
strcpy(pStr,pStr+i);
i = strlen(pStr);
while(*(pStr+i)== ' '&&i!= 0)
i--;
*(pStr+i) = '\0';
return pStr;
}//-------
int funclose(char *str1) //check y or n
{ int returns=0;
if (str1[1])
{returns=1;}
else
if(toupper(str1[0])!='Y'&&toupper(str1[0])!='N')
{
returns=1;
}
else returns=0;
return returns;
}
//判断恺撒密钥是否合法
int funcCkkey(char *str1)
{ int s=strlen(str1);
int num=atoi(str1);
int i;
int returns=1;
if(strcmp(trim(str1),"")==0||str1[0]=='0')
{returns=0;}
if(isdigit(str1[0])||str1[0]=='-')
{ for(i=1;i<s;i++)
if (isdigit(str1[i]))
{
continue;
}
else
{
returns=0;
break;
}
}
else
returns=0;
return returns;
}
//恺撒加密输入加密及加密过程
void encrypted(char *str)
{ int flag=1;
int i,tempz;
int leng=strlen(str);
if (ckkey>=0)
{
for(i=0;i<leng;i++)
{
if(*str>=65&&*str<=90)
{ //如果是大写字母
*str = *str + ckkey; //移位
if(*str>=91) //移位后仍然在大写字母集中,直接返回
{
*str = *str%90+64;
}
str++;
}
else if(*str>='a'&&*str<='z')
{ //如果是小写字母
tempz=*str+ckkey;
*str = *str + ckkey;
//移位
if(tempz>122) //移位后仍然在小写字母集,直接返回
{
*str= tempz%122+96; //超出则转换下
}
str++;
}
else
{
str++;
}
}
}
else
for(i=0;i<leng;i++)
{
if(*str>=65&&*str<=90)
{ //如果是大写字母
*str = *str + ckkey; //移位
if(*str<=64) //移位后仍然在大写字母集中,直接返回
{
*str =*str+26;
}
str++;
}
else if(*str>=97&&*str<=122)
{ //如果是小写字母
*str = *str + ckkey; //移位
if(*str<=96) //移位后仍然在小写字母集,直接返回
{
*str =*str+26; //超出则转换下
}
str++;
}
else
{
str++;
}
}
}
//加密信息的输入
void inforfunc(void)
{ int con=1;
while(con)
{
cout<<"请输入您要加密的英文信息:" ;
cin.getline(information,100);
if(strcmp(information,"")==0)
{ cout<<"\n信息不能为空,请重新输入!"<<endl;
}
else
con=0;
}
}
//恺撒加密<---------------------
void kaisa(void)
{char temp;
int continuekai=1;
cin.get(temp);
while(continuekai)
{
cout<<"\n 请输入恺撒加密密钥(任意整数):";
cin.getline(key,50);
ckkey=atoi(key)%26;
if(funcCkkey(key))
{
//cout<<ckkey;
inforfunc();
encrypted(information);//执行恺撒加密
cout<<"\n加密后的信息为:"<<information<<endl;
continuekai=0;
}
else
{
cout<<"\n输入的密钥不合法,请重新输入!"<<endl;
}
}
}
//恺撒减密
void kaisajianmi( )
{ int continuejm;
int continuej=1;
char temp1;
char s[5];
continuejm=1;
while(continuejm)
{cout<<"是否解密?(Y/N)";
cin>>s;
if (funclose(s))
{
cout<<"操作有误,请重新输入!";
}
else
{
continuejm=0;
}
}
while ((s[0]!='N')&&(s[0]!='n'))
{ cin.get(temp1);
while(continuej)
{
cout<<"请输入恺撒减密密钥(任意整数):";
//fflush(stdin);
//cin>>key;
cin.getline(key,50);
//cin.get(temp);
if(funcCkkey(key))
{
ckkey=-(atoi(key)%26);
encrypted(information);//执行减密
cout<<"\n减密后的信息为:"<<information<<endl;
continuej=0;
}
else
{
cout<<"\n输入的密钥不合法,请重新输入!"<<endl;
}
}
break;
}
}
//<--------------字母表密钥检索及生成
bool ckzmkey(char *str)
{ int s,ss=0;
bool boolen;
int len=strlen(str);
if(strcmp(trim(str),"")!=0)
{ for(s=0;s<len;s++)
{
if(tolower(str[s])>='a'&&tolower(str[s])<='z'||str[s]==' ')
{
ss=ss+1;
if(ss>=len)
{
boolen=true;
}
}
else
{
boolen=false;
break;
}
}
}
else
{boolen=false;}
return boolen;
}
//<----去掉字母密钥中重复出现的字母
char *delcfzmkey(char *str)
{ int i=0,s=0;
int len=strlen(str);
for(int m=0;m<len;m++)
{
for( i=m+1;i<len;i++)
{
if(str[m]==str[i]||str[i]==' ')
for(s=i;s<len;s++)
str[s]=str[s+1];
}
}
for(i=0;i<26;i++)
{
str[i]=tolower(str[i]);
}
return str;
}
//<---------------字母表密钥生成
void zmkeycrts()
{
strcpy(zmkey,delcfzmkey(zmkey));
int len=strlen(zmkey);
strcat(zmkey,zm);
delcfzmkey(zmkey);
}
//<-------字母表加密过程
void zmencrypted(char *str)
{ int i,j;
int len=strlen(str);
for(j=0;j<len;j++)
for( i=0;i<26;i++)
{ if(islower(information[j]))
{
if (information[j]==zm[i])
{
information[j]=zmkey[i];
break;
}
}
else if(isupper(information[j]))
if (information[j]==toupper(zm[i]))
{
information[j]=toupper(zmkey[i]);
break;
}
}
}
//<------字母表加密解密
void zimubiao()
{int continuezimu=1;
char temp;
cin.get(temp);
while(continuezimu)
{
cout<<"请输入字母表加密密钥:";
cin.getline(zmkey,20);
if (ckzmkey(zmkey))
{
zmkeycrts();
inforfunc();
cout<<"\n 原始字母表:"<<zm<<endl;
cout<<"\n加密后的字母表:"<<zmkey<<endl;
zmencrypted(information);
cout<<"\n加密后的信息为:"<<information<<endl;
continuezimu=0;
}
else
{cout<<"\n字母表密钥输入不合法!请重新输入"<<endl;
}
}
}
//<------字母表解密过程
void zmdisencrypted(char *str)
{int i,j;
int len=strlen(str);
for(j=0;j<len;j++)
for( i=0;i<26;i++)
{ if(islower(information[j]))
{
if (information[j]==zmkey[i])
{
information[j]=zm[i];
break;
}
}
else if(isupper(information[j]))
if (tolower(information[j])==(zmkey[i]))
{
information[j]=toupper(zm[i]);
break;
}
}
}
//<------字母表解密
void zimubjm( )
{ int continuezimujm=1;
int continuej;
char temp;
char s[5];
while(continuezimujm)
{cout<<"\n是否解密?(Y/N)";
cin>>s;
if (funclose(s))
{
cout<<"操作有误,请重新输入!";
}
else
{
continuezimujm=0;
}
}
while ((s[0]!='N')&&(s[0]!='n'))
{ continuej=1;
while(continuej)
{
cout<<"请输入字母表解密密钥:";
cin.get(temp);
cin.getline(zmkey,20);
if (ckzmkey(zmkey))
{
zmkeycrts();
zmdisencrypted(information);
cout<<"\n字母表解密后的信息为:"<<information<<endl;
continuej=0;
}
else
{cout<<"\n字母表密钥输入不合法!请重新输入"<<endl;
}
}
break;
}
}
void main()
{
int continueopt;
int continuext=1;
int clear=0;
char tmp;
char i[2]="Y";
char check[5];//是否继续操作标记
char username[10];
int j;
char password[10];
cout<<" *****************--加密解密系统--*****************"<<endl<<endl;
while(continuext)
{ cout<<"用户名: ";
cin>>username;
printf("密码:");
for (j=0;j<9;j++)
{
password[j]=getch();
if (password[j]=='\r')
{
break;
}
if (password[j]==8)//回退,
{
j--;
password[j]='\0';
cout<<"\b \b";
cout.flush();
continue;
}
cout<<'*';//不想要回显或更改回显字符就改这两句
cout.flush();//
}
password[j]='\0';
int name=strcmp(trim(username),"chy");
int pass=strcmp(trim(password),"123456");
if((pass!=0)||(name!=0))//&&(!pass))
{
cout<<"\n用户名或密码错误,请重新输入!"<<endl;
}
else
{ break; }
}
while ((i[0]!='N')&&(i[0]!='n'))
{
if(clear==0)
{
system("cls");
cout<<" ************--加密解密系统--*****************"<<endl;
cout<<" * 服务项目: *"<<endl;
cout<<" * 1.恺撒加密解密 *"<<endl;
cout<<" * 2.字母表加密解密 *"<<endl;
cout<<" * 3.退出系统 *"<<endl;
cout<<" *********************************************"<<endl;
}
cout<<" 请选择服务项目: ";
cin>>check;
if(check[1]!=0)
{
continue;
}
tmp=check[0]-'0';
switch(tmp)
{
case 1:
kaisa();
kaisajianmi();
break;
case 2:
zimubiao();
zimubjm();
break;
case 3:
exit(0);
break;
default:
continue;
}
continueopt=1;
while(continueopt)
{
cout<<"Do you continue?(Y/N)";
cin>>i;
if(funclose(i))
{
cout<<"输入有误,请重新输入: ";
}
else
{
continueopt=0;
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?