摘抄自网络上,稍作修改。
只能加密数据量比较小的,数据量超过一定长度存在错误。
用16字节密钥加密,加密数据长度估计最多是txt文件的一行,64字节;也可能和文件读写方法fread/fwrite等有关,导致读出的和写入的不同。
1 //AES 2 3 #include4 #include 5 #include 6 #include 7 #include 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 }//if298 //第二种情况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 if324 //第三种情况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 }//Block411 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 }//switch472 } while (flag);473 }