1 #include"stdafx.h" 2 #include<stdio.h> 3 #include<string.h> 4 void main() 5 { //声明变量 6 char MingWen[104]; //存放原始的明文 7 char target[8]; //将明文断成8个字符的一个分组 8 char InputKey[9]; //存放字符型的八位密钥 9 int text[64]; //存放一个分组转成二进制后的数据 10 int text_ip[64]; //存放第一次初始换位的结果 11 int L0[32], Li[32]; //将64位分成左右各32位进行迭代 12 int R0[32], Ri[32]; 13 int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 14 int key[64]; //存放密钥的二进制形式 15 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 16 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 17 int B[28]; 18 int keyAB[56]; //将循环左移后两部分的结果合并起来 19 int K[16][48]; //存放16次循环左移产生的子密钥 20 int RK[48]; //存放RE和K异或运算后的结果 21 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 22 int SP[32]; //将RKS表中的十进制数化成二进制 23 int RKSP[32]; //存放SP表经过P盒换位后的结果 24 int text_end[64]; //存放经过左右32位换位后的结果 25 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制 26 char init[9] = { "HTmadeit" }; //设置初始化向量为“HTmadeit” 27 int CBC[64]; 28 int result[13][64]; 29 int H[208]; 30 char MiWen[208]; 31 int C[832]; 32 int M[13][8]; 33 34 char choice; 35 int t; 36 int i, j; 37 int k, l, m, n; 38 int r[8], c[8]; 39 int flag = 1; 40 41 int IP[64] = { //初始换位表 42 58, 50, 42, 34, 26, 18, 10, 2, 43 60, 52, 44, 36, 28, 20, 12, 4, 44 62, 54, 46, 38, 30, 22, 14, 6, 45 64, 56, 48, 40, 32, 24, 16, 8, 46 57, 49, 41, 33, 25, 17, 9, 1, 47 59, 51, 43, 35, 27, 19, 11, 3, 48 61, 53, 45, 37, 29, 21, 13, 5, 49 63, 55, 47, 39, 31, 23, 15, 7 50 }; 51 52 int E[48] = { //扩展换位表 53 32, 1, 2, 3, 4, 5, 54 4, 5, 6, 7, 8, 9, 55 8, 9, 10, 11, 12, 13, 56 12, 13, 14, 15, 16, 17, 57 16, 17, 18, 19, 20, 21, 58 20, 21, 22, 23, 24, 25, 59 24, 25, 26, 27, 28, 29, 60 28, 29, 30, 31, 32, 1 }; 61 62 int PC1[56] = { //PC1换位表(64—>56) 63 57, 49, 41, 33, 25, 17, 9, 64 1, 58, 50, 42, 34, 26, 18, 65 10, 2, 59, 51, 43, 35, 27, 66 19, 11, 3, 60, 52, 44, 36, 67 63, 55, 47, 39, 31, 23, 15, 68 7, 62, 54, 46, 38, 30, 22, 69 14, 6, 61, 53, 45, 37, 29, 70 21, 13, 5, 28, 20, 12, 4 }; 71 72 int move[16] = { //循环移位表 73 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 }; 74 75 int PC2[48] = { //PC2换位表(56—>48) 76 14, 17, 11, 24, 1, 5, 77 3, 28, 15, 6, 21, 10, 78 23, 19, 12, 4, 26, 8, 79 16, 7, 27, 20, 13, 2, 80 41, 52, 31, 37, 47, 55, 81 30, 40, 51, 45, 33, 48, 82 44, 49, 39, 56, 34, 53, 83 46, 42, 50, 36, 29, 32 }; 84 85 int S1[4][16] = { //S换位表 86 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 87 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 88 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 89 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 90 }; 91 int S2[4][16] = { 92 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 93 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 94 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 95 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 96 }; 97 int S3[4][16] = { 98 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 99 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 100 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 101 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 102 }; 103 int S4[4][16] = { 104 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 105 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 106 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 107 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 108 }; 109 int S5[4][16] = { 110 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 111 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 112 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 113 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 114 }; 115 int S6[4][16] = { 116 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 117 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 118 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 119 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 120 }; 121 int S7[4][16] = { 122 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 123 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 124 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 125 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 126 }; 127 int S8[4][16] = { 128 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 129 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 130 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 131 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 132 }; 133 int P[32] = { //P换位表 134 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10, 135 2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25 136 }; 137 138 printf("欢迎使用SKY的加密&解密小程序!\n\n"); 139 while (flag) 140 { 141 printf("A加密,B解密,请选择:\n"); 142 scanf("%c", &choice); 143 144 while (choice != 'A'&&choice != 'B'&&choice != 'a'&&choice != 'b') 145 { 146 printf("对不起,您的输入不合法。请选择A或B,A表示加密,B表示解密。\n"); 147 scanf("%c", &choice); 148 } 149 getchar(); 150 151 //生成子密钥 152 printf("请输入8位密钥:\n"); 153 gets_s(InputKey); 154 while (InputKey[7] == '\0' || InputKey[8] != '\0') 155 { 156 printf("您输入的密钥位数有误,请重新输入8位密钥:\n"); 157 gets_s(InputKey); 158 } 159 160 for (i = 0; i<8; i++) //将密钥转化成64位二进制数放到一维数组key中 161 { 162 int a[8] = { 0,0,0,0,0,0,0,0 }; 163 m = InputKey[i]; 164 for (j = 0; m != 0; j++) 165 { 166 a[j] = m % 2; 167 m = m / 2; 168 } 169 for (j = 0; j<8; j++) 170 key[(i * 8) + j] = a[7 - j]; 171 } 172 173 //for(i=0;i<64;i++) 174 //printf("%d,",key[i]); 175 176 for (i = 0; i<56; i++) //通过PC1换位表变成56位密钥放在keyPC1中 177 keyPC1[i] = key[PC1[i] - 1]; 178 179 for (i = 0; i<28; i++) //分成A和B两部分,各28位 180 { 181 A[i] = keyPC1[i]; 182 B[i] = keyPC1[i + 28]; 183 } 184 185 for (t = 0; t<16; t++) 186 { 187 if (move[t] == 1) //按照循环移位表将Ai和Bi分别左移move[t]位 188 { 189 n = A[0]; 190 for (i = 0; i<27; i++) 191 A[i] = A[i + 1]; 192 A[27] = n; 193 n = B[0]; 194 for (i = 0; i<28; i++) 195 B[i] = B[i + 1]; 196 B[27] = n; 197 } 198 else 199 { 200 n = A[0]; 201 m = A[1]; 202 for (i = 0; i<26; i++) 203 A[i] = A[i + 2]; 204 A[26] = n; 205 A[27] = m; 206 n = B[0]; 207 m = B[1]; 208 for (i = 0; i<26; i++) 209 B[i] = B[i + 2]; 210 B[26] = n; 211 B[27] = m; 212 } 213 214 for (i = 0; i<28; i++) //将A和B合并成56位 215 { 216 keyAB[i] = A[i]; 217 keyAB[i + 28] = B[i]; 218 } 219 220 for (i = 0; i<48; i++) //通过PC2换位表变成48位密钥 221 K[t][i] = keyAB[PC2[i] - 1]; 222 } 223 224 //for(t=0;t<16;t++) 225 //for(i=0;i<48;i++) 226 // printf("%d,",K[t][i]); 227 228 for (i = 0; i<8; i++) //将初始化向量转化成二进制数储存到数组text_out的第一行中 229 { 230 int a[8] = { 0,0,0,0,0,0,0,0 }; 231 m = init[i]; 232 for (j = 0; m != 0; j++) 233 { 234 a[j] = m % 2; 235 m = m / 2; 236 } 237 for (j = 0; j<8; j++) 238 text_out[0][(i * 8) + j] = a[7 - j]; 239 } 240 241 242 //加密程序 243 244 if (choice == 'A' || choice == 'a') 245 { 246 printf("请输入您想加密的内容:\n"); //输入明文 247 gets_s(MingWen); 248 while (MingWen[0] == '\0') 249 { 250 printf("对不起,明文不可为空,请您输入正确的明文。\n"); 251 gets_s(MingWen); 252 } 253 254 //CBC模式下的加密 255 i = 0; //将明文每8个字符作为一个分组,共有n个分组 256 n = 0; 257 while (MingWen[i] != '\0') 258 { 259 n++; 260 i++; 261 } 262 k = n % 8; 263 n = (n - 1) / 8 + 1; 264 265 for (l = 0; l<n; l++) 266 { 267 if (l == (n - 1) && k != 0) 268 { 269 for (i = 0; i<k; i++) //将每个分组的8个字符放到数组target中,不够的用空格补充 270 target[i] = MingWen[i + (8 * l)]; 271 for (i = k; i<8; i++) 272 target[i] = ' '; 273 } 274 else 275 for (i = 0; i<8; i++) 276 target[i] = MingWen[i + (8 * l)]; 277 278 for (i = 0; i<8; i++) //将得到的明文转化成二进制数储存到数组text中 279 { 280 int a[8] = { 0,0,0,0,0,0,0,0 }; 281 m = target[i]; 282 for (j = 0; m != 0; j++) 283 { 284 a[j] = m % 2; 285 m = m / 2; 286 } 287 for (j = 0; j<8; j++) 288 text[(i * 8) + j] = a[7 - j]; 289 } 290 291 //for(i=0;i<64;i++) 292 //printf("%d,",text[i]); 293 //printf("\n"); 294 295 //for(i=0;i<64;i++) 296 //printf("%d,",text_out[l][i]); 297 //printf("\n"); 298 299 for (i = 0; i<64; i++) //CBC模式下前一分组的密文异或当前分组 300 text[i] = text_out[l][i] ^ text[i]; 301 302 //for(i=0;i<64;i++) 303 //printf("%d,",text[i]); 304 //printf("\n"); 305 306 //对每个text进行DES加密 307 308 for (i = 0; i<64; i++) //进行初始换位 309 text_ip[i] = text[IP[i] - 1]; 310 311 for (i = 0; i<32; i++) //分成左右两部分,各32位 312 { 313 L0[i] = text_ip[i]; 314 R0[i] = text_ip[i + 32]; 315 } 316 317 //for(i=0;i<32;i++) 318 // printf("%d,",L0[i]); 319 //for(i=0;i<32;i++) 320 // printf("%d,",R0[i]); 321 322 323 //十六次迭代 324 325 for (t = 0; t<16; t++) 326 { 327 for (i = 0; i<48; i++) //将右半部分通过扩展换位表E从32位扩展成48位 328 RE0[i] = R0[E[i] - 1]; 329 330 //printf("RE0\n"); 331 //for(i=0;i<48;i++) 332 //printf("%d,",RE0[i]); 333 334 for (i = 0; i<48; i++) //RE与K异或运算 335 RK[i] = RE0[i] ^ K[t][i]; 336 337 338 //printf("\n"); 339 //for(i=0;i<48;i++) 340 //printf("%d,",RK[i]); 341 342 for (i = 0; i<8; i++) //将R和K异或运算的结果通过S位移表 343 { 344 r[i] = RK[(i * 6) + 0] * 2 + RK[(i * 6) + 5]; 345 c[i] = RK[(i * 6) + 1] * 8 + RK[(i * 6) + 2] * 4 + RK[(i * 6) + 3] * 2 + RK[(i * 6) + 4]; 346 } 347 RKS[0] = S1[r[0]][c[0]]; 348 RKS[1] = S2[r[1]][c[1]]; 349 RKS[2] = S3[r[2]][c[2]]; 350 RKS[3] = S4[r[3]][c[3]]; 351 RKS[4] = S5[r[4]][c[4]]; 352 RKS[5] = S6[r[5]][c[5]]; 353 RKS[6] = S7[r[6]][c[6]]; 354 RKS[7] = S8[r[7]][c[7]]; 355 356 for (i = 0; i<8; i++) //把结果转成32位二进制储存在数组SP中 357 { 358 int b[4] = { 0,0,0,0 }; 359 m = RKS[i]; 360 for (j = 3; m != 0; j--) 361 { 362 b[j] = m % 2; 363 m = m / 2; 364 } 365 for (j = 0; j<4; j++) 366 SP[j + (i * 4)] = b[j]; 367 } 368 369 for (i = 0; i<32; i++) //将二进制结果再经过一个P盒换位 370 RKSP[i] = SP[P[i] - 1]; 371 372 for (i = 0; i<32; i++) //与前一次的左部异或运算,得到本次迭代的右部 373 Ri[i] = L0[i] ^ RKSP[i]; 374 375 for (i = 0; i<32; i++) 376 { 377 L0[i] = R0[i]; 378 R0[i] = Ri[i]; 379 } 380 } 381 382 //一个左右32位交换 383 384 for (i = 0; i<32; i++) 385 Li[i] = R0[i]; 386 for (i = 0; i<32; i++) 387 R0[i] = L0[i]; 388 for (i = 0; i<32; i++) 389 L0[i] = Li[i]; 390 391 392 //初始换位的逆过程 393 394 for (i = 0; i<32; i++) //把左右两部分合起来存到text_end中 395 text_end[i] = L0[i]; 396 for (i = 32; i<64; i++) 397 text_end[i] = R0[i - 32]; 398 399 for (i = 0; i<64; i++) //进行初始换位的逆过程 400 text_out[l + 1][IP[i] - 1] = text_end[i]; 401 402 for (i = 0; i<64; i++) 403 result[l][i] = text_out[l + 1][i]; 404 405 //for(i=0;i<64;i++) 406 //printf("%d,",result[l][i]); 407 //printf("\n"); 408 } 409 410 for (j = 0; j<n; j++) //把result中的二进制密文转成十进制存到数组H中 411 for (i = 0; i<16; i++) 412 H[i + (j * 16)] = result[j][0 + (i * 4)] * 8 + result[j][1 + (i * 4)] * 4 + result[j][2 + (i * 4)] * 2 + result[j][3 + (i * 4)]; 413 414 //for(i=0;i<l*16;i++) 415 //printf("%d,",H[i]); 416 417 for (i = 0; i<n * 16; i++) 418 { 419 if (H[i]<10) 420 MiWen[i] = H[i] + 48; 421 else if (H[i] == 10) 422 MiWen[i] = 'A'; 423 else if (H[i] == 11) 424 MiWen[i] = 'B'; 425 else if (H[i] == 12) 426 MiWen[i] = 'C'; 427 else if (H[i] == 13) 428 MiWen[i] = 'D'; 429 else if (H[i] == 14) 430 MiWen[i] = 'E'; 431 else if (H[i] == 15) 432 MiWen[i] = 'F'; 433 //else MiWen[i]='\0'; 434 } 435 for (i = l * 16; i<224; i++) 436 MiWen[i] = '\0'; 437 438 printf("您的文件经过DES加密后的密文是:\n"); 439 printf("%s\n", MiWen); 440 printf("\n\n"); 441 } 442 443 444 //解密程序 445 else if (choice == 'B' || choice == 'b') 446 { 447 printf("请输入密文内容:\n"); 448 gets_s(MiWen); 449 450 for (i = 0; i<208; i++) 451 H[i] = 0; 452 453 for (i = 0; MiWen[i] != '\0'; i++) //将十六进制密文转化成十进制存放在数组H中 454 { 455 if (MiWen[i] >= '0'&&MiWen[i] <= '9') 456 H[i] = MiWen[i] - '0'; 457 else if (MiWen[i] >= 'A'&&MiWen[i] <= 'F') 458 H[i] = MiWen[i] - 'A' + 10; 459 else if (MiWen[i] >= 'a'&&MiWen[i] <= 'f') 460 H[i] = MiWen[i] - 'a' + 10; 461 else 462 { 463 printf("请输入用十六进制表示的密文内容:\n"); 464 gets_s(MiWen); 465 i = 0; 466 } 467 } 468 n = i; //密文中共有n个字符 469 if (n % 16 != 0) 470 { 471 printf("对不起,您输入的密文不正确,请确认密文的内容,密文的字符数应是16的倍数。\n"); 472 printf("请输入密文内容:\n"); 473 gets_s(MiWen); 474 475 for (i = 0; i<208; i++) 476 H[i] = 0; 477 for (i = 0; MiWen[i] != '\0'; i++) //将十六进制密文转化成十进制存放在数组H中 478 { 479 if (MiWen[i] >= '0'&&MiWen[i] <= '9') 480 H[i] = MiWen[i] - '0'; 481 else if (MiWen[i] >= 'A'&&MiWen[i] <= 'F') 482 H[i] = MiWen[i] - 'A' + 10; 483 else if (MiWen[i] >= 'a'&&MiWen[i] <= 'f') 484 H[i] = MiWen[i] - 'a' + 10; 485 } 486 } 487 488 for (i = 0; i<n; i++) //将十进制密文转化成二进制存放在数组C中 489 { 490 int he[4] = { 0,0,0,0 }; 491 for (j = 3; H[i] != 0; j--) 492 { 493 he[j] = H[i] % 2; 494 H[i] = H[i] / 2; 495 } 496 for (j = 0; j<4; j++) 497 C[j + (i * 4)] = he[j]; 498 } 499 500 //for(i=0;i<130;i++) 501 // printf("%d,",C[i]); 502 //printf("\n"); 503 504 k = n / 16; 505 for (l = 0; l<k; l++) 506 { 507 for (i = 0; i<64; i++) //将每个分组对应的64位二进制密文放到text_out中 508 text_out[l + 1][i] = C[i + (l * 64)]; 509 510 //for(i=0;i<64;i++) 511 // printf("%d,",text_out[l][i]); 512 //printf("\n"); 513 514 //对每个text进行DES解密 515 516 for (i = 0; i<64; i++) //进行初始换位 517 text_ip[i] = text_out[l + 1][IP[i] - 1]; 518 519 //for(i=0;i<64;i++) 520 //printf("%d,",text_ip[i]); 521 //printf("\n"); 522 523 for (i = 0; i<32; i++) //分成左右两部分,各32位 524 { 525 L0[i] = text_ip[i]; 526 R0[i] = text_ip[i + 32]; 527 } 528 //for(i=0;i<32;i++) 529 // printf("%d,",L0[i]); 530 //for(i=0;i<32;i++) 531 // printf("%d,",R0[i]); 532 533 534 //十六次迭代 535 536 for (t = 0; t<16; t++) 537 { 538 for (i = 0; i<48; i++) //将右半部分通过扩展换位表E从32位扩展成48位 539 RE0[i] = R0[E[i] - 1]; 540 541 //printf("RE0\n"); 542 //for(i=0;i<48;i++) 543 //printf("%d,",RE0[i]); 544 545 for (i = 0; i<48; i++) //RE与K异或运算 546 RK[i] = RE0[i] ^ K[15 - t][i]; 547 548 //printf("\n"); 549 //for(i=0;i<48;i++) 550 //printf("%d,",RK[i]); 551 552 for (i = 0; i<8; i++) //将R和K异或运算的结果通过S位移表 553 { 554 r[i] = RK[(i * 6) + 0] * 2 + RK[(i * 6) + 5]; 555 c[i] = RK[(i * 6) + 1] * 8 + RK[(i * 6) + 2] * 4 + RK[(i * 6) + 3] * 2 + RK[(i * 6) + 4]; 556 } 557 558 RKS[0] = S1[r[0]][c[0]]; 559 RKS[1] = S2[r[1]][c[1]]; 560 RKS[2] = S3[r[2]][c[2]]; 561 RKS[3] = S4[r[3]][c[3]]; 562 RKS[4] = S5[r[4]][c[4]]; 563 RKS[5] = S6[r[5]][c[5]]; 564 RKS[6] = S7[r[6]][c[6]]; 565 RKS[7] = S8[r[7]][c[7]]; 566 567 for (i = 0; i<8; i++) //把结果转成32位二进制储存在数组SP中 568 { 569 int b[4] = { 0,0,0,0 }; 570 m = RKS[i]; 571 for (j = 3; m != 0; j--) 572 { 573 b[j] = m % 2; 574 m = m / 2; 575 } 576 for (j = 0; j<4; j++) 577 SP[j + (i * 4)] = b[j]; 578 } 579 580 for (i = 0; i<32; i++) //将二进制结果再经过一个P盒换位 581 RKSP[i] = SP[P[i] - 1]; 582 583 for (i = 0; i<32; i++) //与前一次的左部异或运算,得到本次迭代的右部 584 Ri[i] = L0[i] ^ RKSP[i]; 585 586 for (i = 0; i<32; i++) 587 { 588 L0[i] = R0[i]; 589 R0[i] = Ri[i]; 590 } 591 } 592 593 //一个左右32位交换 594 595 for (i = 0; i<32; i++) 596 Li[i] = R0[i]; 597 for (i = 0; i<32; i++) 598 R0[i] = L0[i]; 599 for (i = 0; i<32; i++) 600 L0[i] = Li[i]; 601 602 //初始换位的逆过程 603 604 for (i = 0; i<32; i++) //把左右两部分合起来存到text_end中 605 text_end[i] = L0[i]; 606 for (i = 32; i<64; i++) 607 text_end[i] = R0[i - 32]; 608 609 for (i = 0; i<64; i++) //进行初始换位的逆过程 610 text[IP[i] - 1] = text_end[i]; 611 612 613 //CBC模式下的解密 614 615 for (i = 0; i<64; i++) //前一分组的密文异或当前分组所得明文的二进制放到result中 616 result[l][i] = text_out[l][i] ^ text[i]; 617 618 } 619 620 for (i = 0; i<(n / 16); i++) //将二进制转成十进制 621 for (j = 0; j<8; j++) 622 M[i][j] = result[i][(j * 8) + 0] * 128 + result[i][(j * 8) + 1] * 64 + result[i][(j * 8) + 2] * 32 + result[i][(j * 8) + 3] * 16 + result[i][(j * 8) + 4] * 8 + result[i][(j * 8) + 5] * 4 + result[i][(j * 8) + 6] * 2 + result[i][(j * 8) + 7]; 623 624 printf("您的文件经过DES解密后的明文是:\n"); 625 for (i = 0; i<(n / 16); i++) 626 for (j = 0; j<8; j++) 627 printf("%c", M[i][j]); 628 printf("\n\n\n"); 629 } 630 flag = 0; 631 printf("是否继续?\n"); 632 printf("Y继续,N退出,请选择:\n"); 633 scanf("%c", &choice); 634 635 while (choice != 'Y'&&choice != 'N'&&choice != 'y'&&choice != 'n') 636 { 637 printf("对不起,您的输入不合法。请选择Y或N,Y表示继续使用本程序,N表示退出。\n"); 638 scanf("%c", &choice); 639 } 640 getchar(); 641 if (choice == 'Y' || choice == 'y') 642 flag = 1; 643 } 644 }