简单的加解密

/*************************************************************     
    FileName : EnDecrypt.cpp   
    FileFunc : 已知的最古老的一种加密技术是凯撒加密(得名于Julius Caesar)。
			   该方法把一条消息中的每个字母用字母表中固定距离之后的那个字母来替代。
		      (如果越过了字母Z,会绕回到字母表的起始位置。
			   例如,如果每个字母都用字母表中两个位置之后的字母代替,那么Y就被替换为A,Z就被替换为B。)
			   编写程序用凯撒加密方法对消息进行加密。用户输入待加密的消息和移位计数(字母移动的位置数目):
			   Enter message to be encrypted:  Go ahead,make my day.
			   Enter shift amount(1-25):  3
			   Encrypted message:  Jr  dkhdg,  pdnh  pb  gdb.
			   注意,当用户输入26与移位计数的差值时,程序可以对消息进行解密:
			   Enter message to be encrypted:  Jr  dkhdg,  pdnh  pb  gdb.
			   Enter shift amount(1-25):  23
			   Encrypted message: Go ahead,make my day.
			   可以假定消息的长度不超过80个字符。不是字母的那些字符不要改动。此外,加密时不要改变字母的大小写。
			   提示:为了解决前面提到的绕回问题,可以用表达式((ch-'A')+n)%26+'A' 计算大写字母的密码,其中ch存储字母,n存储移位计数。(小写字母也需要一个类似的表达式。)	
    Version  : V0.1     
    Author   : Sunrier     
    Date     : 2011-11-21  
    Descp    : 简单的加解密   
*************************************************************/ 
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>


#define		MAXLEN					80
#define		TRUE                    1   
#define		FALSE                   0

unsigned char Information[8][80]={
"****************************************	\r\n",
"******		简单的加解密	  ******	\r\n",
"******              1.加密	  ******	\r\n",
"******              2.解密	  ******	\r\n",
"******            Esc.退出	  ******	\r\n",
"******   建立时间:2011-11-21     ******	\r\n",
"******       作者:Sunrier	  ******	\r\n",
"****************************************	\r\n",
};

unsigned char PC_GetKey (signed int *c);

void Encrypt(char *EncryptData,unsigned char ucBase,char *EncryptedData)
{
	while(*EncryptData)
	{
		if( (*EncryptData>='a') && (*EncryptData<='z') )
		{
			*EncryptedData=((*EncryptData-'a')+ucBase)%26+'a';
		}
		else
		{
			if( (*EncryptData>='A') && (*EncryptData<='Z') )
			{
				*EncryptedData=((*EncryptData-'A')+ucBase)%26+'A';
			}
			else
			{
				*EncryptedData = *EncryptData;
			}
		}


		EncryptData++;
		EncryptedData++;
	}		
}

void Decrypt(char *DecryptData,unsigned char ucBase,char *DecryptedData)
{
	while(*DecryptData)
	{
		if( (*DecryptData>='a') && (*DecryptData<='z') )
		{
			*DecryptedData=((*DecryptData-'a')+26-ucBase)%26+'a';
		}
		else
		{
			if( (*DecryptData>='A') && (*DecryptData<='Z') )
			{
				*DecryptedData=((*DecryptData-'A')+26-ucBase)%26+'A';
			}
			else
			{
				*DecryptedData = *DecryptData;
			}
		}


		DecryptData++;
		DecryptedData++;
	}		
}

void main( void )
{  
	char EncryptData[MAXLEN],EncryptedData[MAXLEN];
	char DecryptData[MAXLEN],DecryptedData[MAXLEN];

	unsigned char ucI;
	unsigned char ucFlag =1;
	unsigned char ucBase;
	unsigned int uiI=0;
	signed int ucKey;
	char ch;

	while(1)
	{
		if(ucFlag)
		{
			for(ucI=0;ucI<8;ucI++)
				printf("%s",Information[ucI]);
		}
		ucFlag =0;
		while (PC_GetKey(&ucKey)==TRUE)  
        {                                   
											  /* See if key has been pressed        */  
            if (ucKey == 0x1B)                /* Yes, see if it's the ESCAPE key    */  
            {  
				ucFlag =1;
                //printf("Exit!\n"); 
				printf("谢谢使用本软件!\n"); 
				exit(1); 			
            }  
			else
			{
				if( '1'==ucKey )
				{
					ucFlag =1;
				

					memset(EncryptData,0,sizeof(EncryptData));
					memset(EncryptedData,0,sizeof(EncryptedData));
					//printf("Enter message to be encrypted:\n");
					printf("请输入需要加密的数据:\n");
					fflush(stdin); 
					gets(EncryptData);
					
					if( !strlen(EncryptData) )
					{
						ucFlag =1;
						printf("输入的加密数据有误!\n");
						break;
					}
					//printf("Enter shift amount(1-25):\n");
					printf("请输入加密基数(1-25):\n");
					
					fflush(stdin); 
					
					ch=getchar();
					ucBase=ch-'0';
					
					if(ucBase<1 || ucBase>25)
					{
						ucFlag =1;
						printf("输入的加密基数有误!\n");
						break;
					}
								
					Encrypt(EncryptData,ucBase,EncryptedData);

					//printf("Encrypted message:%s\n",EncryptedData);
					printf("加密后的数据为:%s\n",EncryptedData);

				}
				else
				{
					if('2'==ucKey )
					{
						ucFlag =1;
						//printf("Enter message to be decrypted:\n");
						printf("请输入需要解密的数据:\n");

						memset(DecryptData,0,sizeof(DecryptData));
						memset(DecryptedData,0,sizeof(DecryptedData));

						fflush(stdin); 
						gets(DecryptData);
						if( !strlen(DecryptData) )
						{
							ucFlag =1;
							printf("输入的解密数据有误!\n");
							break;
						}
						fflush(stdin);
						//printf("Enter shift amount(1-25):\n");
						printf("请输入解密基数(1-25):\n");
						fflush(stdin); 
						ch=getchar();
						ucBase=ch-'0';
						
						if(ucBase<1 || ucBase>25)
						{
							ucFlag =1;
							printf("输入的解密基数有误!\n");
							break;
						}

						Decrypt(DecryptData,ucBase,DecryptedData);

						//printf("Decrypted message:%s\n",DecryptedData);
						printf("解密后的数据为:%s\n",DecryptedData);

					}
					else
					{
						printf("输入信息有误!\n");
					}

				}
			}
		}
	}
}

unsigned char PC_GetKey (signed int *c)  
{  
    if (kbhit())                    /* See if a key has been pressed       */  
    {                                           
		*c = (signed int)getch();       /* Get key pressed           */                          
        return (TRUE);  
    }   
    else                            /* No key pressed                      */  
    {  
        *c = 0x00;                                           
        return (FALSE);  
    }  
} 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值