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("

输入密钥长度不满足要求!
"); 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("

加密文件成功!

");
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("

输入密钥长度不满足要求!
"); 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("

解密文件成功!

");
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("
");
429         printf("                             1.加密文件

");
430         printf("                             2.解密文件

");
431         printf("                             3.退出

");
432         printf("
请选择要进行的操作:");
433         scanf("%d", &choice);
434         switch (choice){
435         case 1: fp1 = fopen("源文件.txt", "r");
436             if (fp1 == NULL){
437                 printf("打开源文件失败!
");
438                 getchar();
439                 exit(0);
440             }
441             fp2 = fopen("加密后文件.txt", "w");
442             if (fp2 == NULL){
443                 printf("打开加密后文件失败!
");
444                 getchar();
445                 exit(0);
446             }
447             printf("
请输入加密密钥(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("
打开加密后文件失败!
");
455                 getchar();
456                 exit(0);
457             }
458             fp2 = fopen("解密后文件.txt", "w");
459             if (fp2 == NULL){
460                 printf("
打开解密后文件失败!
");
461                 getchar();
462                 exit(0);
463             }
464             printf("

请输入解密密钥(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("

所选操作不合法!
");
471         }//switch
472     } while (flag);
473 }
C Code
原文地址:https://www.cnblogs.com/starf/p/3657546.html