/************************************************************* 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); } }