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 + -
显示快捷键?