001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
| /* **基于凯撒密码的加密解密小程序 */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<windows.h> #define DECIPHER_SIZE 26 #define NAME_SIZE 20 //文件名的长度 #define HEAD "=======================================" #define LINE "---------------------------------------" #define END "=======================================" void menu(void); //菜单函数 char encrypt(char const ch, int key); //加密函数 char decipher(char const ch, int key); //解密函数 FILE *open_file(char const *name, char const *style); //打开文件的函数 void close_file(FILE *fname); //关闭文件的函数 int main(void) { int select, key; char yes; //保存用户的选择(y/n); char *name; char *store; char ch; //变量ch保存每次从文件中读出来的一个字符 FILE *fp, *input; //分别用来打开源文件和目的文件的文件指针变量 name = malloc(NAME_SIZE); store = malloc(NAME_SIZE); menu(); //打印菜单 while(1) { printf("请选择: "); scanf("%d", &select); //用户输入他选择的操作 if(1 == select) { printf("输入需要加密的文件的文件名: "); scanf("%s", name); fp = open_file(name, "r"); //打开要进行加密的文件 printf("请输入加密密钥: "); scanf("%d", &key); printf("输入保存加密后文件的文件名: "); scanf("%s", store); input = open_file(store, "w"); //打开加密后文件所要保存的目的文件 while((ch = fgetc(fp)) != EOF) { fputc(encrypt(ch, key), input); } //关闭文件 close_file(fp); close_file(input); } /*解密操作*/ else if(2 == select) { printf("输入需要解密的文件的文件名: "); scanf("%s", name); printf("请输入解密后要存入的文件名: "); scanf("%s", store); input = open_file(store, "a"); //打开保存解密后文本的文件 key = 1; while(key < DECIPHER_SIZE) { fp = open_file(name, "r"); while((ch = fgetc(fp)) != EOF) { fputc(decipher(ch, key), input); //打开需要解密的文件 } close_file(fp); fputc('\n', input); ++key; } close_file(input); } //用户选择退出系统是的操作 else if(3 == select) { printf("真的要退出系统?(y/n)\n"); scanf("%s", &yes); if('n' == yes || 'N' == yes) continue; if('y' == yes || 'Y' == yes) exit(0); } else { printf("错误的输入,请重新输入!\n"); continue; } /*询问用户是否继续*/ printf("是否继续?(y/n):"); scanf("%s", &yes); if('n' == yes || 'N' == yes) exit(-1); if('y' == yes || 'Y' == yes) system("cls"); menu(); } /*释放内存*/ free(name); free(store); return EXIT_SUCCESS; //成功返回 } /*函数用来打印菜单*/ void menu(void) { printf(" **** 凯撒密码加密解密系统 ****\n"); printf(HEAD"\n"); printf("\t☆☆☆ MENU ☆☆☆\n"); printf(LINE"\n"); printf("Option:\n"); printf("\t1. 对文件加密\n"); printf("\t2. 对文件解密\n"); printf("\t3. 退出系统\n"); printf(LINE"\n"); printf("\t 版本:V1.0\n"); printf(END"\n"); } /*函数用来打开文件*/ FILE *open_file(char const *name, char const *style) { FILE *fp; fp = fopen(name, style); if(NULL == fp) { perror("打开文件失败!"); exit(EXIT_FAILURE); } return fp; } /*函数用来关闭文件*/ void close_file(FILE *fname) { if( fclose( fname ) != 0 ) { perror("关闭文件失败!"); exit(EXIT_FAILURE); } } /*对字符进行加密操作的函数*/ char encrypt(char const ch, int key) { if(ch >= 0 && ch <= 128) return (ch + key) % 128; } /*对字符进行解密操作的函数*/ char decipher(char const ch, int key) { key = 26 - key; if(ch >= 'a' && ch <= 'z') return 'a' + (ch - 'a' + key) % DECIPHER_SIZE; else if(ch >= 'A' && ch <= 'Z') return 'A' + (ch - 'A' + key) % DECIPHER_SIZE; else return ch; } |
凯撒密码破解
最新推荐文章于 2024-09-10 09:23:43 发布