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 }