AES加密的C语言实现
摘抄自网络上,稍作修改。
只能加密数据量比较小的,数据量超过一定长度存在错误。
用16字节密钥加密,加密数据长度估计最多是txt文件的一行,64字节;也可能和文件读写方法fread/fwrite等有关,导致读出的和写入的不同。
1 //AES 2 3 #include <stdio.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <conio.h> 7 #include <iostream> 8 9 using namespace std; 10 11 /*S盒*/ 12 const unsigned char s[16][16] = 13 { 14 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 15 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 16 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 17 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 18 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 19 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 20 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 21 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 22 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 23 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 24 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 25 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 26 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 27 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 28 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 29 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 30 }; 31 32 /*逆S盒*/ 33 const unsigned char inv_s[16][16] = 34 { 35 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 36 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 37 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 38 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 39 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 40 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 41 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 42 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 43 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 44 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 45 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 46 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 47 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 48 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 49 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 50 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D 51 }; 52 53 /*Rcon变换*/ 54 const unsigned char Rcon[11][4] = 55 { 56 0x00, 0x00, 0x00, 0x00, 57 0x01, 0x00, 0x00, 0x00, 58 0x02, 0x00, 0x00, 0x00, 59 0x04, 0x00, 0x00, 0x00, 60 0x08, 0x00, 0x00, 0x00, 61 0x10, 0x00, 0x00, 0x00, 62 0x20, 0x00, 0x00, 0x00, 63 0x40, 0x00, 0x00, 0x00, 64 0x80, 0x00, 0x00, 0x00, 65 0x1b, 0x00, 0x00, 0x00, 66 0x36, 0x00, 0x00, 0x00 67 }; 68 69 /*函数声明*/ 70 int SumBytes(FILE *fp);//1 71 void ByteToBits(unsigned char ch, unsigned char bit[]);//2 72 void SubBytes(unsigned char status[][4], unsigned char bit[]);//3 73 void Inv_SubBytes(unsigned char status[][4], unsigned char bit[]);//4 74 void ShiftRows(unsigned char status[][4]);//5 75 void Inv_ShiftRows(unsigned char status[][4]);//6 76 unsigned char ByteMultiply(unsigned char c);//7 77 void MixColumns(unsigned char status[][4]);//8 78 void Inv_MixColumns(unsigned char status[][4]);//9 79 void RotWord(unsigned char c[], unsigned char temp[]);//10 80 void SubWord(unsigned char temp[], unsigned char bit[]);//11 81 void KeyExpansion(char *k, unsigned char key[][4], unsigned char bit[]);//12 82 void RoundKeyChoice(unsigned char key[][4], unsigned char RoundKey[][4], int cnt); //13 83 void AddRoundKey(unsigned char RoundKey[][4], unsigned char status[][4]);//14 84 void BytesWrite(FILE *fp, unsigned char status[][4]);//15 85 void DataEncrypt(char *k, unsigned char key[][4], unsigned char bit[], FILE *fp1, FILE *fp2, unsigned char RoundKey[][4], unsigned char status[][4]); 86 void DataDecrypt(char *k1, unsigned char key[][4], FILE *fp1, FILE *fp2, unsigned char status[][4], unsigned char RoundKey[][4], unsigned char bit[]); 87 88 /*1、计算被加密文件数据的字节数目*/ 89 int SumBytes(FILE *fp){ 90 int num = 0; 91 char ch = fgetc(fp); 92 while (ch != EOF){ 93 num++; 94 ch = fgetc(fp); 95 } 96 return num; 97 } 98 99 /*2、字节转换为二进制位存放在数组中*/ 100 void ByteToBits(unsigned char ch, unsigned char bit[]){ 101 for (int i = 0; i < 8; i++) 102 bit[i] = (ch >> i) & 1; 103 } 104 105 /*3、S盒变换*/ 106 void SubBytes(unsigned char status[][4], unsigned char bit[]){ 107 for (int i = 0; i < 4; i++) 108 for (int j = 0; j < 4; j++){ 109 ByteToBits(status[i][j], bit); 110 status[i][j] = s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])]; 111 } 112 } 113 114 /*4、逆S盒变换*/ 115 void Inv_SubBytes(unsigned char status[][4], unsigned char bit[]){ 116 for (int i = 0; i < 4; i++) 117 for (int j = 0; j < 4; j++){ 118 ByteToBits(status[i][j], bit); 119 status[i][j] = inv_s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])]; 120 } 121 } 122 123 /*5、行变换*/ 124 void ShiftRows(unsigned char status[][4]){ 125 unsigned char temp1 = status[1][0]; 126 unsigned char temp2 = status[2][0]; 127 unsigned char temp3 = status[2][1]; 128 unsigned char temp4 = status[3][0]; 129 unsigned char temp5 = status[3][1]; 130 unsigned char temp6 = status[3][2]; 131 for (int i = 0; i < 3; i++) 132 status[1][i] = status[1][(i + 1)]; 133 status[1][3] = temp1; 134 for (int i = 0; i < 2; i++) 135 status[2][i] = status[2][(i + 2)]; 136 status[2][2] = temp2; 137 status[2][3] = temp3; 138 status[3][0] = status[3][3]; 139 status[3][1] = temp4; 140 status[3][2] = temp5; 141 status[3][3] = temp6; 142 } 143 144 /*6、逆行变换*/ 145 void Inv_ShiftRows(unsigned char status[][4]){ 146 unsigned char temp1 = status[1][3]; 147 unsigned char temp2 = status[2][2]; 148 unsigned char temp3 = status[2][3]; 149 unsigned char temp4 = status[3][1]; 150 for (int i = 3; i > 0; i--) 151 status[1][i] = status[1][i - 1]; 152 status[1][0] = temp1; 153 for (int i = 3; i > 1; i--) 154 status[2][i] = status[2][i - 2]; 155 status[2][0] = temp2; 156 status[2][1] = temp3; 157 for (int i = 1; i < 4; i++) 158 status[3][i] = status[3][(i + 1) % 4]; 159 status[3][0] = temp4; 160 } 161 162 /*7、列变换被调用函数x乘法(02乘法)*/ 163 unsigned char ByteMultiply(unsigned char c){ 164 unsigned char temp; 165 temp = c << 1; 166 if (c & 0x80){ 167 temp ^= 0x1b; 168 } 169 return temp; 170 } 171 172 /*8、列变换*/ 173 void MixColumns(unsigned char status[][4]){ 174 unsigned char temp[4][4]; 175 for (int j = 0; j < 4; j++) 176 for (int i = 0; i < 4; i++) 177 temp[i][j] = ByteMultiply(status[i % 4][j]) //0x02乘法 178 ^ (status[(i + 1) % 4][j] ^ ByteMultiply(status[(i + 1) % 4][j])) //0x03乘法 179 ^ status[(i + 2) % 4][j] //0x01乘法 180 ^ status[(i + 3) % 4][j]; //0x01乘法 181 for (int i = 0; i < 4; i++) 182 for (int j = 0; j < 4; j++) 183 status[i][j] = temp[i][j]; 184 } 185 186 /*9、逆列变换*/ 187 void Inv_MixColumns(unsigned char status[][4]){ 188 unsigned char temp[4][4]; 189 for (int j = 0; j< 4; j++) 190 for (int i = 0; i<4; i++) 191 temp[i][j] = (ByteMultiply(ByteMultiply(ByteMultiply(status[i % 4][j]))) ^ ByteMultiply(ByteMultiply(status[i % 4][j])) ^ ByteMultiply(status[i % 4][j])) //0x0E乘法 192 ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 1) % 4][j]))) ^ ByteMultiply(status[(i + 1) % 4][j]) ^ status[(i + 1) % 4][j]) //0x0B乘法 193 ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 2) % 4][j]))) ^ ByteMultiply(ByteMultiply(status[(i + 2) % 4][j])) ^ status[(i + 2) % 4][j]) //0x0D乘法 194 ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 3) % 4][j]))) ^ status[(i + 3) % 4][j]); //0x09乘法 195 for (int i = 0; i < 4; i++) 196 for (int j = 0; j < 4; j++) 197 status[i][j] = temp[i][j]; 198 } 199 200 /*10、位置变换*/ 201 void RotWord(unsigned char c[], unsigned char temp[]){ 202 for (int i = 1; i < 4; i++) 203 temp[i - 1] = c[i]; 204 temp[3] = c[0]; 205 } 206 207 /*11、小S盒变换*/ 208 void SubWord(unsigned char temp[], unsigned char bit[]){ 209 for (int i = 0; i < 4; i++){ 210 ByteToBits(temp[i], bit); 211 temp[i] = s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])]; 212 } 213 } 214 215 /*12、密钥扩展函数*/ 216 void KeyExpansion(char *k, unsigned char key[][4], unsigned char bit[]){ 217 int i, j; 218 unsigned char temp[4]; 219 for (i = 0; i < 44; i++) 220 for (j = 0; j < 4; j++){ 221 if (i < 4) key[i][j] = *(k + 4 * i + j); 222 else if ((i != 0) && (i % 4 == 0)){ 223 RotWord(key[i - 1], temp); 224 SubWord(temp, bit); 225 key[i][j] = key[i - 4][j] ^ temp[j] ^ Rcon[i / 4][j]; 226 } 227 else key[i][j] = key[i - 1][j] ^ key[i - 4][j]; 228 } 229 } 230 231 /*13、从扩展密钥中选择轮密钥的函数*/ 232 void RoundKeyChoice(unsigned char key[][4], unsigned char RoundKey[][4], int cnt){ 233 int cnt1 = 4 * cnt; 234 for (int i = 0; i < 4; i++){ 235 for (int j = 0; j < 4; j++){ 236 RoundKey[i][j] = key[cnt1][j]; 237 } 238 cnt1++; 239 } 240 } 241 242 /*14、与扩展密钥的异或运算*/ 243 void AddRoundKey(unsigned char RoundKey[][4], unsigned char status[][4]){ 244 for (int j = 0; j < 4; j++) 245 for (int i = 0; i < 4; i++) 246 status[i][j] = status[i][j] ^ RoundKey[j][i]; 247 } 248 249 /*15、将状态矩阵中的字节写入文件中函数*/ 250 void BytesWrite(FILE *fp, unsigned char status[][4]){ 251 char ch; 252 for (int i = 0; i < 4; i++) 253 for (int j = 0; j < 4; j++){ 254 ch = status[i][j]; 255 fputc(ch, fp); 256 } 257 } 258 259 /*16.加密总函数*/ 260 void DataEncrypt(char *k, unsigned char key[][4], unsigned char bit[], FILE *fp1, FILE *fp2, unsigned char RoundKey[][4], unsigned char status[][4]) { 261 int sum, numOfBlock, numOfSurplus; 262 char ch; 263 int len = strlen(k); 264 if (len != 16){ 265 free(k); 266 printf("\n\n输入密钥长度不满足要求!\n"); return; 267 } 268 KeyExpansion(k, key, bit); 269 sum = SumBytes(fp1); 270 fp1 = fopen("源文件.txt", "r"); 271 numOfBlock = sum / 16; 272 numOfSurplus = sum % 16; 273 ch = fgetc(fp1); 274 /*第一种情况*/ 275 if (numOfBlock != 0 && numOfSurplus == 0){ 276 for (int n = 1; n <= numOfBlock; n++){ 277 for (int i = 0; i < 4; i++) 278 for (int j = 0; j < 4; j++){ 279 status[i][j] = ch; 280 ch = fgetc(fp1); 281 }//status赋值 282 RoundKeyChoice(key, RoundKey, 0); 283 AddRoundKey(RoundKey, status); 284 for (int nr = 1; nr <= 10; nr++){ 285 SubBytes(status, bit); 286 ShiftRows(status); 287 MixColumns(status); 288 RoundKeyChoice(key, RoundKey, nr); 289 AddRoundKey(RoundKey, status); 290 }//10轮加密 291 SubBytes(status, bit); 292 ShiftRows(status); 293 RoundKeyChoice(key, RoundKey, 4); 294 AddRoundKey(RoundKey, status); 295 BytesWrite(fp2, status); 296 }//Block循环 297 }//if 298 //第二种情况 299 else if (numOfBlock == 0 && numOfSurplus != 0){ 300 for (int i = 0; i < 4; i++) 301 for (int j = 0; j < 4; j++){ 302 if (ch == EOF) break; 303 status[i][j] = ch; 304 ch = fgetc(fp1); 305 } 306 for (int i = sum / 4; i < 4; i++) 307 for (int j = sum % 4; j < 4; j++) 308 status[i][j] = 0x00; 309 RoundKeyChoice(key, RoundKey, 0); 310 AddRoundKey(RoundKey, status); 311 for (int nr = 1; nr <= 10; nr++){ 312 SubBytes(status, bit); 313 ShiftRows(status); 314 MixColumns(status); 315 RoundKeyChoice(key, RoundKey, nr); 316 AddRoundKey(RoundKey, status); 317 }//10轮加密 318 SubBytes(status, bit); 319 ShiftRows(status); 320 RoundKeyChoice(key, RoundKey, 4); 321 AddRoundKey(RoundKey, status); 322 BytesWrite(fp2, status); 323 }//else if 324 //第三种情况 325 else if (numOfBlock != 0 && numOfSurplus != 0){ 326 for (int n = 1; n <= numOfBlock; n++){ 327 for (int i = 0; i <4; i++) 328 for (int j = 0; j < 4; j++){ 329 status[i][j] = ch; 330 ch = fgetc(fp1); 331 }//status赋值 332 RoundKeyChoice(key, RoundKey, 0); 333 AddRoundKey(RoundKey, status); 334 for (int nr = 1; nr <= 10; nr++){ 335 SubBytes(status, bit); 336 ShiftRows(status); 337 MixColumns(status); 338 RoundKeyChoice(key, RoundKey, nr); 339 AddRoundKey(RoundKey, status); 340 }//10轮加密 341 SubBytes(status, bit); 342 ShiftRows(status); 343 RoundKeyChoice(key, RoundKey, 4); 344 AddRoundKey(RoundKey, status); 345 BytesWrite(fp2, status); 346 }//Block循环 347 for (int i = 0; i < 4; i++) 348 for (int j = 0; j < 4; j++){ 349 if (ch == EOF) break; 350 status[i][j] = ch; 351 ch = fgetc(fp1); 352 } 353 for (int i = sum / 4; i < 4; i++) 354 for (int j = sum % 4; j < 4; j++) 355 status[i][j] = 0x00; 356 RoundKeyChoice(key, RoundKey, 0); 357 AddRoundKey(RoundKey, status); 358 for (int nr = 1; nr <= 10; nr++){ 359 SubBytes(status, bit); 360 ShiftRows(status); 361 MixColumns(status); 362 RoundKeyChoice(key, RoundKey, nr); 363 AddRoundKey(RoundKey, status); 364 }//10轮加密 365 SubBytes(status, bit); 366 ShiftRows(status); 367 RoundKeyChoice(key, RoundKey, 4); 368 AddRoundKey(RoundKey, status); 369 BytesWrite(fp2, status); 370 }//else 371 free(k); 372 fclose(fp1); 373 fclose(fp2); 374 printf("\n\n加密文件成功!\n\n"); 375 } 376 377 /*17.解密总函数*/ 378 void DataDecrypt(char *k1, unsigned char key[][4], FILE *fp1, FILE *fp2, unsigned char status[][4], unsigned char RoundKey[][4], unsigned char bit[]) { 379 int numOfBlock, sum; 380 char ch; 381 int len = strlen(k1); 382 if (len != 16){ 383 free(k1); 384 printf("\n\n输入密钥长度不满足要求!\n"); return; 385 } 386 sum = SumBytes(fp1); 387 fp1 = fopen("加密后文件.txt", "r"); 388 numOfBlock = sum / 16; 389 ch = fgetc(fp1); 390 for (int i = 1; i <= numOfBlock; i++){ 391 for (int i = 0; i < 4; i++) 392 for (int j = 0; j < 4; j++){ 393 status[i][j] = ch; 394 ch = fgetc(fp1); 395 } 396 RoundKeyChoice(key, RoundKey, 4); 397 AddRoundKey(RoundKey, status); 398 Inv_ShiftRows(status); 399 Inv_SubBytes(status, bit); 400 for (int nr = 10; nr >= 1; nr--){ 401 RoundKeyChoice(key, RoundKey, nr); 402 AddRoundKey(RoundKey, status); 403 Inv_MixColumns(status); 404 Inv_ShiftRows(status); 405 Inv_SubBytes(status, bit); 406 }//10轮解密 407 RoundKeyChoice(key, RoundKey, 0); 408 AddRoundKey(RoundKey, status); 409 BytesWrite(fp2, status); 410 }//Block 411 free(k1); 412 fclose(fp1); 413 fclose(fp2); 414 printf("\n\n解密文件成功!\n\n"); 415 } 416 417 int main(){ 418 int choice, sum1; 419 int flag = 1; 420 char *k, *k1; 421 FILE *fp1, *fp2; 422 unsigned char status[4][4] = { 0x00 }; 423 unsigned char key[44][4] = { 0x00 }; 424 unsigned char RoundKey[4][4] = { 0x00 }; 425 unsigned char bit[8] = { 0x00 }; 426 do{ 427 printf("*****************************AES加密解密文件************************************"); 428 printf("\n"); 429 printf(" 1.加密文件\n\n"); 430 printf(" 2.解密文件\n\n"); 431 printf(" 3.退出\n\n"); 432 printf("\n请选择要进行的操作:"); 433 scanf("%d", &choice); 434 switch (choice){ 435 case 1: fp1 = fopen("源文件.txt", "r"); 436 if (fp1 == NULL){ 437 printf("打开源文件失败!\n"); 438 getchar(); 439 exit(0); 440 } 441 fp2 = fopen("加密后文件.txt", "w"); 442 if (fp2 == NULL){ 443 printf("打开加密后文件失败!\n"); 444 getchar(); 445 exit(0); 446 } 447 printf("\n请输入加密密钥(128bit):"); 448 k = (char *)malloc(20 * sizeof(char)); 449 cin >> k; 450 DataEncrypt(k, key, bit, fp1, fp2, RoundKey, status); 451 break; 452 case 2: fp1 = fopen("加密后文件.txt", "r"); 453 if (fp1 == NULL){ 454 printf("\n打开加密后文件失败!\n"); 455 getchar(); 456 exit(0); 457 } 458 fp2 = fopen("解密后文件.txt", "w"); 459 if (fp2 == NULL){ 460 printf("\n打开解密后文件失败!\n"); 461 getchar(); 462 exit(0); 463 } 464 printf("\n\n请输入解密密钥(128bit):"); 465 k1 = (char *)malloc(20 * sizeof(char)); 466 cin >> k1; 467 DataDecrypt(k1, key, fp1, fp2, status, RoundKey, bit); 468 break; 469 case 3: flag = 0; break; 470 default: printf("\n\n所选操作不合法!\n"); 471 }//switch 472 } while (flag); 473 }