DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心。蒟蒻并不想说自己用了多久才把代码写好的。
我真的太难了QAQ
1 #include<iostream> 2 using namespace std; 3 4 5 6 int jiami(){ 7 8 // 明文 9 int mingwen[64]; 10 11 12 cout<<"请输入16位十六进制的明文:"; 13 string kk; 14 cin>>kk; 15 int len=kk.length(); 16 17 18 while(len!=16){ 19 cout<<"请重新输入16位十六进制的明文:"; 20 cin>>kk; 21 len=kk.length(); 22 } 23 24 int jishu=0; 25 for(int i=0;i<16;i++){ 26 int a; 27 if(kk[i]>=‘0‘&&kk[i]<=‘9‘) 28 a=kk[i]-‘0‘; 29 else 30 a=kk[i]-‘A‘+10; 31 32 int n[4]={0}; 33 int f=0; 34 while(a){ 35 n[f]=a%2; 36 a=a/2; 37 f++; 38 } 39 mingwen[jishu*4]=n[3]; 40 mingwen[jishu*4+1]=n[2]; 41 mingwen[jishu*4+2]=n[1]; 42 mingwen[jishu*4+3]=n[0]; 43 jishu++; 44 } 45 46 47 48 //初始置换IP 49 int IP[64]={58, 50, 42, 34, 26, 18, 10, 2, 50 60, 52, 44, 36, 28, 20, 12, 4, 51 62, 54, 46, 38, 30, 22, 14, 6, 52 64, 56, 48, 40, 32, 24, 16, 8, 53 57, 49, 41, 33, 25, 17, 9, 1, 54 59, 51, 43, 35, 27, 19, 11, 3, 55 61, 53, 45, 37, 29, 21, 13, 5, 56 63, 55, 47, 39, 31, 23, 15, 7}; 57 58 59 60 61 62 // 选择运算E 32位明文扩充为48位 63 int E[48]={ 32, 1, 2, 3, 4, 5, 64 4, 5, 6, 7, 8, 9, 65 8, 9, 10, 11, 12, 13, 66 12, 13, 14, 15, 16, 17, 67 16, 17, 18, 19, 20, 21, 68 20, 21, 22, 23, 24, 25, 69 24, 25, 26, 27, 28, 29, 70 28, 29, 30, 31, 32, 1 }; 71 72 73 //64位秘钥 0123456789ABCDEF 56位的秘钥+8位校验码 74 int miyao[64]; 75 cout<<"请输入16位十六进制的秘钥:"; 76 string k_2; 77 cin>>k_2; 78 int len_2=k_2.length(); 79 80 81 while(len_2!=16){ 82 cout<<"请重新输入16位十六进制的秘钥:"; 83 cin>>k_2; 84 len_2=k_2.length(); 85 } 86 87 int jishu_2=0; 88 for(int i=0;i<16;i++){ 89 int a; 90 if(k_2[i]>=‘0‘&&k_2[i]<=‘9‘) 91 a=k_2[i]-‘0‘; 92 else 93 a=k_2[i]-‘A‘+10; 94 95 int n[4]={0}; 96 int f=0; 97 while(a){ 98 n[f]=a%2; 99 a=a/2; 100 f++; 101 } 102 miyao[jishu_2*4]=n[3]; 103 miyao[jishu_2*4+1]=n[2]; 104 miyao[jishu_2*4+2]=n[1]; 105 miyao[jishu_2*4+3]=n[0]; 106 jishu_2++; 107 } 108 109 110 //置换选择1 111 int IP_1[56]={57, 49, 41, 33, 25, 17, 9, 112 1, 58, 50, 42, 34, 26, 18, 113 10, 2, 59, 51, 43, 35, 27, 114 19, 11, 3, 60, 52, 44, 36, 115 63, 55, 47, 39, 31, 23, 15, 116 7, 62, 54, 46, 38, 30, 22, 117 14, 6, 61, 53, 45, 37, 29, 118 21, 13, 5, 28, 20, 12, 4}; 119 120 121 122 //16次左移对应的位数 123 int weiyi[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; 124 // 置换选择2 秘钥56->48位压缩 125 int IP_2[48]={14, 17, 11, 24, 1, 5, 126 3, 28, 15, 6, 21, 10, 127 23, 19, 12, 4, 26, 8, 128 16, 7, 27, 20, 13, 2, 129 41, 52, 31, 37, 47, 55, 130 30, 40, 51, 45, 33, 48, 131 44, 49, 39, 56, 34, 53, 132 46, 42, 50, 36, 29, 32}; 133 134 //S盒 135 136 int s[8][65]= 137 { 138 { 139 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 140 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 141 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 142 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13 143 }, 144 { 145 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 146 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 147 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 148 13,8,10,1,3,15,4,2,11,6,7,12,10,5,14,9 149 }, 150 { 151 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 152 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 153 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 154 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12 155 }, 156 { 157 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 158 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 159 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 160 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 161 }, 162 { 163 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 164 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 165 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 166 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3 167 }, 168 { 169 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 170 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 171 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 172 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 173 }, 174 { 175 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 176 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 177 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 178 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 179 }, 180 { 181 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 182 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 183 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 184 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 185 } 186 }; 187 188 189 //P置换 190 int P[32]={16, 7, 20, 21, 29, 12, 28, 17, 191 1, 15, 23, 26, 5, 18, 31, 10, 192 2, 8, 24, 14, 32, 27, 3, 9, 193 19, 13, 30, 6, 22, 11, 4, 25 }; 194 195 196 197 //1初始置换 198 //1.1 64明文进行初始置换分左右 199 int mingwen_1[64]; 200 int l[32],r[32]; 201 for (int i=0;i<64;i++){ 202 mingwen_1[i]=mingwen[IP[i]-1]; 203 } 204 for(int i=0;i<32;i++){ 205 l[i]=mingwen_1[i]; 206 r[i]=mingwen_1[i+32]; 207 } 208 cout<<"明文初始置换M ="; 209 for(int i=0;i<64;i++){ 210 if(i%64==0) cout<<" "; 211 cout<<mingwen_1[i]; 212 } 213 cout<<endl; 214 215 216 //1.2 56位秘钥初始置换分左右 217 218 cout<<"秘钥初始置换k0 ="; 219 for(int i=0;i<64;i++){ 220 if(i%64==0) cout<<" "; 221 cout<<miyao[i]; 222 } 223 cout<<endl; 224 225 int ml[28],mr[28]; 226 int miyao_0[58]; 227 for(int i=0;i<58;i++){ 228 miyao_0[i]=miyao[IP_1[i]-1]; 229 } 230 for(int i=0;i<28;i++){ 231 ml[i]=miyao_0[i]; 232 mr[i]=miyao_0[i+28]; 233 } 234 235 236 //2.循环加密 237 for (int i=0;i<16;i++){ 238 239 cout<<"-------------------------------第"<<i+1<<"轮循环-----------------------------------" <<endl; 240 241 //2.1明文左右交换 242 int new_l[32],new_r[48]; 243 for(int j=0;j<32;j++){ 244 new_l[j]=r[j]; 245 } 246 247 //2.2 右边32位拓展变换成48位 248 for(int j=0;j<48;j++){ 249 new_r[j]=r[E[j]-1]; 250 } 251 252 253 //2.3 左右秘钥 左移 254 int new_ml[28],new_mr[28]; 255 for(int j=0;j<28;j++){ 256 new_ml[j]=ml[(j+28+weiyi[i])%28]; 257 new_mr[j]=mr[(j+28+weiyi[i])%28]; 258 } 259 260 //2.4 重新合并成56位的秘钥 261 int miyao_1[56]; 262 for(int j=0;j<28;j++){ 263 miyao_1[j]=new_ml[j]; 264 miyao_1[j+28]=new_mr[j]; 265 } 266 //2.5 IP_2 56位秘钥压缩成48位的秘钥 267 int k[48]; 268 for (int j=0;j<48;j++){ 269 k[j]=miyao_1[IP_2[j]-1]; 270 } 271 272 273 cout<<"k"<<i+1<<" ="; 274 for(int j=0;j<48;j++){ 275 if(j%6==0) cout<<" "; 276 cout<<k[j]; 277 } 278 cout<<endl; 279 280 281 cout<<"R"<<i<<" "<<"="; 282 for(int j=0;j<48;j++){ 283 if(j%6==0) cout<<" "; 284 cout<<new_r[j]; 285 } 286 cout<<endl; 287 288 289 //2.6 2.2和2.5XOR 290 int new_r2[48]; 291 for(int j=0;j<48;j++){ 292 new_r2[j]=new_r[j] ^ k[j]; 293 } 294 295 296 cout<<"R(i-1)^ki "<<"="; 297 for(int j=0;j<48;j++){ 298 if(j%6==0) cout<<" "; 299 cout<<new_r2[j]; 300 } 301 cout<<endl; 302 303 //2.7 s盒 304 int new_r3[32]; 305 int b1,b2,b3,b4,b5,b6; 306 int m=0; 307 for(int j=0;j<8;j++){ 308 int row = ((new_r2[j*6])<<1)+(new_r2[j*6+5]); //第1,6位组成行号 309 int col = ((new_r2[j*6+1])<<3)+((new_r2[j*6+2])<<2)+((new_r2[j*6+3])<<1)+(new_r2[j*6+4]); //第2,3,4,5位组成列号 310 //找到s盒对应的数 311 int a=s[j][16*row+col]; 312 313 //转成对应的2进制 314 int n[4]={0}; 315 int f=0; 316 while(a){ 317 n[f]=a%2; 318 a=a/2; 319 f++; 320 } 321 322 new_r3[m*4]=n[3]; 323 new_r3[m*4+1]=n[2]; 324 new_r3[m*4+2]=n[1]; 325 new_r3[m*4+3]=n[0]; 326 m++; 327 } 328 329 cout<<"第"<<i+1<<"轮s盒"<<" ="; 330 for(int j=0;j<32;j++){ 331 if(j%8==0) cout<<" "; 332 cout<<new_r3[j]; 333 } 334 cout<<endl; 335 336 //2.8 P置换 337 int new_r4[32]; 338 for(int j=0;j<32;j++){ 339 new_r4[j]=new_r3[P[j]-1]; 340 } 341 342 cout<<"P置换 "<<"="; 343 for(int j=0;j<32;j++){ 344 if(j%8==0) cout<<" "; 345 cout<<new_r4[j]; 346 } 347 cout<<endl; 348 349 350 351 //2.9 明文左边32位和2.8 new_r4[32] XOR 352 int new_r5[32]; 353 for(int j=0;j<32;j++){ 354 new_r5[j]=l[j] ^ new_r4[j]; 355 //更新左右明文,以便于下次循环 356 l[j]=new_l[j]; 357 r[j]=new_r5[j]; 358 } 359 360 cout<<"R"<<i+1<<" ="; 361 for(int j=0;j<32;j++){ 362 if(j%8==0) cout<<" "; 363 cout<<new_r5[j]; 364 } 365 cout<<endl; 366 cout<<"L"<<i+1<<" ="; 367 for(int j=0;j<32;j++){ 368 if(j%8==0) cout<<" "; 369 cout<<new_l[j]; 370 } 371 cout<<endl; 372 //2.10 更新左右秘钥,以便于下次循环 373 for(int j=0;j<28;j++){ 374 ml[j]=new_ml[j]; 375 mr[j]=new_mr[j]; 376 } 377 378 379 cout<<"----------------------------------------------------------------------------"<<endl<<endl<<endl; 380 381 } 382 383 //3. 循环加密之后的明文mingwen_1[64] 384 for(int i=0;i<32;i++){ 385 mingwen_1[i]=r[i]; 386 mingwen_1[i+32]=l[i]; 387 } 388 389 390 // cout<<"逆置换前="; 391 // for(int i=0;i<64;i++){ 392 // cout<<mingwen_1[i]; 393 // } 394 // cout<<endl<<endl; 395 396 //4. 逆置换 397 int miwen[64]; 398 for(int i=0;i<64;i++){ 399 miwen[IP[i]-1]=mingwen_1[i]; 400 } 401 402 403 //5.输出 404 405 cout<<"原明文为:"; 406 for(int i=0;i<64;i++){ 407 if(i%64==0) cout<<endl; 408 cout<<mingwen[i]; 409 } 410 cout<<endl<<endl; 411 cout<<"秘钥为:"; 412 for(int i=0;i<64;i++){ 413 if(i%64==0) cout<<endl; 414 cout<<miyao[i]; 415 } 416 cout<<endl<<endl; 417 cout<<"密文为:"; 418 for(int i=0;i<64;i++){ 419 if(i%64==0) cout<<endl; 420 cout<<miwen[i]; 421 } 422 //是否将密文转换成十六进制?(Y or N) 423 424 cout<<endl<<endl<<"是否将密文转换成十六进制?(Y or N):"; 425 char YN; 426 cin>>YN; 427 cout<<endl<<"十六进制密文表示:"; 428 if(YN==‘Y‘){ 429 for(int i=0;i<16;i++){ 430 int q=miwen[i*4]*8+miwen[i*4+1]*4+miwen[i*4+2]*2+miwen[i*4+3]; 431 if(q>=0 && q<= 9){ 432 cout<<q; 433 } 434 else{ 435 cout<<hex<<uppercase<<q; 436 } 437 } 438 } 439 cout<<endl<<endl<<"!!!!皆大欢喜,普天同庆!!!!"<<endl; 440 return 0; 441 } 442 443 int jiemi(){ 444 // 密文 445 int miwen[64]; 446 447 448 cout<<"请输入16位十六进制的密文:"; 449 string kk; 450 cin>>kk; 451 int len=kk.length(); 452 453 454 while(len!=16){ 455 cout<<"请重新输入16位十六进制的密文:"; 456 cin>>kk; 457 len=kk.length(); 458 } 459 460 int jishu=0; 461 for(int i=0;i<16;i++){ 462 int a; 463 if(kk[i]>=‘0‘&&kk[i]<=‘9‘) 464 a=kk[i]-‘0‘; 465 else 466 a=kk[i]-‘A‘+10; 467 468 int n[4]={0}; 469 int f=0; 470 while(a){ 471 n[f]=a%2; 472 a=a/2; 473 f++; 474 } 475 miwen[jishu*4]=n[3]; 476 miwen[jishu*4+1]=n[2]; 477 miwen[jishu*4+2]=n[1]; 478 miwen[jishu*4+3]=n[0]; 479 jishu++; 480 } 481 482 //初始置换IP 483 int IP[64]={58, 50, 42, 34, 26, 18, 10, 2, 484 60, 52, 44, 36, 28, 20, 12, 4, 485 62, 54, 46, 38, 30, 22, 14, 6, 486 64, 56, 48, 40, 32, 24, 16, 8, 487 57, 49, 41, 33, 25, 17, 9, 1, 488 59, 51, 43, 35, 27, 19, 11, 3, 489 61, 53, 45, 37, 29, 21, 13, 5, 490 63, 55, 47, 39, 31, 23, 15, 7}; 491 492 // 选择运算E 32位明文扩充为48位 493 int E[48]={ 32, 1, 2, 3, 4, 5, 494 4, 5, 6, 7, 8, 9, 495 8, 9, 10, 11, 12, 13, 496 12, 13, 14, 15, 16, 17, 497 16, 17, 18, 19, 20, 21, 498 20, 21, 22, 23, 24, 25, 499 24, 25, 26, 27, 28, 29, 500 28, 29, 30, 31, 32, 1 }; 501 502 //64位秘钥 0123456789ABCDEF 56位的秘钥+8位校验码 503 int miyao[64]; 504 cout<<"请输入16位十六进制的秘钥:"; 505 string k_2; 506 cin>>k_2; 507 int len_2=k_2.length(); 508 509 510 while(len_2!=16){ 511 cout<<"请重新输入16位十六进制的秘钥:"; 512 cin>>k_2; 513 len_2=k_2.length(); 514 } 515 516 int jishu_2=0; 517 for(int i=0;i<16;i++){ 518 int a; 519 if(k_2[i]>=‘0‘&&k_2[i]<=‘9‘) 520 a=k_2[i]-‘0‘; 521 else 522 a=k_2[i]-‘A‘+10; 523 524 int n[4]={0}; 525 int f=0; 526 while(a){ 527 n[f]=a%2; 528 a=a/2; 529 f++; 530 } 531 miyao[jishu_2*4]=n[3]; 532 miyao[jishu_2*4+1]=n[2]; 533 miyao[jishu_2*4+2]=n[1]; 534 miyao[jishu_2*4+3]=n[0]; 535 jishu_2++; 536 } 537 538 539 //置换选择1 540 int IP_1[56]={57, 49, 41, 33, 25, 17, 9, 541 1, 58, 50, 42, 34, 26, 18, 542 10, 2, 59, 51, 43, 35, 27, 543 19, 11, 3, 60, 52, 44, 36, 544 63, 55, 47, 39, 31, 23, 15, 545 7, 62, 54, 46, 38, 30, 22, 546 14, 6, 61, 53, 45, 37, 29, 547 21, 13, 5, 28, 20, 12, 4}; 548 549 //16次左移对应的位数 550 int weiyi[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; 551 // 置换选择2 秘钥56->48位压缩 552 int IP_2[48]={14, 17, 11, 24, 1, 5, 553 3, 28, 15, 6, 21, 10, 554 23, 19, 12, 4, 26, 8, 555 16, 7, 27, 20, 13, 2, 556 41, 52, 31, 37, 47, 55, 557 30, 40, 51, 45, 33, 48, 558 44, 49, 39, 56, 34, 53, 559 46, 42, 50, 36, 29, 32}; 560 561 //S盒 562 int s[8][65]= 563 { 564 { 565 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 566 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 567 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 568 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13 569 }, 570 { 571 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 572 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 573 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 574 13,8,10,1,3,15,4,2,11,6,7,12,10,5,14,9 575 }, 576 { 577 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 578 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 579 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 580 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12 581 }, 582 { 583 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 584 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 585 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 586 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 587 }, 588 { 589 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 590 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 591 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 592 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3 593 }, 594 { 595 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 596 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 597 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 598 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 599 }, 600 { 601 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 602 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 603 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 604 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 605 }, 606 { 607 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 608 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 609 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 610 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 611 } 612 }; 613 614 615 //P置换 616 int P[32]={16, 7, 20, 21, 29, 12, 28, 17, 617 1, 15, 23, 26, 5, 18, 31, 10, 618 2, 8, 24, 14, 32, 27, 3, 9, 619 19, 13, 30, 6, 22, 11, 4, 25 }; 620 621 //1初始置换 622 623 //1.1 64密文进行逆置换分左右 624 int miwen_1[64]; 625 int l[32],r[32]; 626 for (int i=0;i<64;i++){ 627 miwen_1[i]=miwen[IP[i]-1]; 628 } 629 for(int i=0;i<32;i++){ 630 r[i]=miwen_1[i]; 631 l[i]=miwen_1[i+32]; 632 } 633 cout<<"密文逆置换 ="; 634 for(int i=0;i<64;i++){ 635 if(i%64==0) cout<<" "; 636 cout<<miwen_1[i]; 637 } 638 cout<<endl; 639 640 641 //1.2 56位秘钥初始置换分左右 642 643 cout<<"秘钥初始置换k0 ="; 644 for(int i=0;i<64;i++){ 645 if(i%64==0) cout<<" "; 646 cout<<miyao[i]; 647 } 648 cout<<endl; 649 650 int ml_0[28],mr_0[28]; 651 int miyao_0[58]; 652 for(int i=0;i<58;i++){ 653 miyao_0[i]=miyao[IP_1[i]-1]; 654 } 655 for(int i=0;i<28;i++){ 656 ml_0[i]=miyao_0[i]; 657 mr_0[i]=miyao_0[i+28]; 658 } 659 660 // 因为加密过程一共左移了28位,回到了原来的位置, 661 //所以我们要先将原始秘钥左移一次。 662 663 int ml[28],mr[28]; 664 for(int j=0;j<28;j++){ 665 ml[j]=ml_0[(j+28+1)%28]; 666 mr[j]=mr_0[(j+28+1)%28]; 667 } 668 669 670 //2.循环解密 671 for (int i=0;i<16;i++){ 672 673 cout<<"-------------------------------第"<<i+1<<"轮循环解密-----------------------------------" <<endl; 674 675 //2.1密文左右交换 676 int new_l[32],new_r[48]; 677 for(int j=0;j<32;j++){ 678 new_r[j]=l[j]; 679 } 680 681 //2.2 左边32位拓展变换成48位 682 for(int j=0;j<48;j++){ 683 new_l[j]=new_r[E[j]-1]; 684 } 685 686 //2.3 左右秘钥 右移 687 688 int new_ml[28],new_mr[28]; 689 for(int j=0;j<28;j++){ 690 new_ml[j]=ml[(j+28-weiyi[16-i])%28]; 691 new_mr[j]=mr[(j+28-weiyi[16-i])%28]; 692 } 693 694 //2.4 重新合并成56位的秘钥 695 int miyao_1[56]; 696 for(int j=0;j<28;j++){ 697 miyao_1[j]=new_ml[j]; 698 miyao_1[j+28]=new_mr[j]; 699 } 700 //2.5 IP_2 56位秘钥压缩成48位的秘钥 701 int k[48]; 702 for (int j=0;j<48;j++){ 703 k[j]=miyao_1[IP_2[j]-1]; 704 } 705 706 cout<<"k"<<16-i<<" ="; 707 for(int j=0;j<48;j++){ 708 if(j%6==0) cout<<" "; 709 cout<<k[j]; 710 } 711 cout<<endl; 712 713 cout<<"L"<<16-i<<" "<<"="; 714 for(int j=0;j<48;j++){ 715 if(j%6==0) cout<<" "; 716 cout<<new_l[j]; 717 } 718 cout<<endl; 719 720 721 //2.6 2.2和2.5XOR 722 int new_l2[48]; 723 for(int j=0;j<48;j++){ 724 new_l2[j]=new_l[j] ^ k[j]; 725 } 726 727 cout<<"Li^ki "<<"="; 728 for(int j=0;j<48;j++){ 729 if(j%6==0) cout<<" "; 730 cout<<new_l2[j]; 731 } 732 cout<<endl; 733 734 //2.7 s盒 735 int new_l3[32]; 736 int b1,b2,b3,b4,b5,b6; 737 int m=0; 738 for(int j=0;j<8;j++){ 739 int row = ((new_l2[j*6])<<1)+(new_l2[j*6+5]); //第1,6位组成行号 740 int col = ((new_l2[j*6+1])<<3)+((new_l2[j*6+2])<<2)+((new_l2[j*6+3])<<1)+(new_l2[j*6+4]); //第2,3,4,5位组成列号 741 //找到s盒对应的数 742 int a=s[j][16*row+col]; 743 744 //转成对应的2进制 745 int n[4]={0}; 746 int f=0; 747 while(a){ 748 n[f]=a%2; 749 a=a/2; 750 f++; 751 } 752 753 new_l3[m*4]=n[3]; 754 new_l3[m*4+1]=n[2]; 755 new_l3[m*4+2]=n[1]; 756 new_l3[m*4+3]=n[0]; 757 m++; 758 } 759 760 cout<<"第"<<16-i<<"轮s盒"<<" ="; 761 for(int j=0;j<32;j++){ 762 if(j%8==0) cout<<" "; 763 cout<<new_l3[j]; 764 } 765 cout<<endl; 766 767 //2.8 P置换 768 int new_l4[32]; 769 for(int j=0;j<32;j++){ 770 new_l4[j]=new_l3[P[j]-1]; 771 } 772 773 cout<<"P置换 "<<"="; 774 for(int j=0;j<32;j++){ 775 if(j%8==0) cout<<" "; 776 cout<<new_l4[j]; 777 } 778 cout<<endl; 779 780 //2.9 密文右边32位和2.8 new_l4[32] XOR 781 int new_l5[32]; 782 for(int j=0;j<32;j++){ 783 new_l5[j]=r[j] ^ new_l4[j]; 784 //更新左右明文,以便于下次循环 785 r[j]=new_r[j]; 786 l[j]=new_l5[j]; 787 } 788 789 cout<<"L"<<16-i-1<<" ="; 790 for(int j=0;j<32;j++){ 791 if(j%8==0) cout<<" "; 792 cout<<new_l5[j]; 793 } 794 cout<<endl; 795 cout<<"R"<<16-i-1<<" ="; 796 for(int j=0;j<32;j++){ 797 if(j%8==0) cout<<" "; 798 cout<<new_r[j]; 799 } 800 cout<<endl; 801 802 //2.10 更新左右秘钥,以便于下次循环 803 for(int j=0;j<28;j++){ 804 ml[j]=new_ml[j]; 805 mr[j]=new_mr[j]; 806 } 807 808 cout<<"ml"<<16-i<<"="; 809 for(int j=0;j<28;j++){ 810 cout<<ml[j]; 811 } 812 cout<<endl; 813 cout<<"mr"<<16-i<<"="; 814 for(int j=0;j<28;j++){ 815 cout<<mr[j]; 816 } 817 cout<<endl; 818 819 cout<<"------------------------------------------------------------------------------"<<endl<<endl<<endl; 820 821 } 822 823 //3. 循环解密之后的密文miwen_1[64] 824 for(int i=0;i<32;i++){ 825 miwen_1[i]=l[i]; 826 miwen_1[i+32]=r[i]; 827 } 828 //4. 初始置换 829 int mingwen[64]; 830 for(int i=0;i<64;i++){ 831 mingwen[IP[i]-1]=miwen_1[i]; 832 } 833 834 835 //5.输出 836 837 cout<<"原密文为:"; 838 for(int i=0;i<64;i++){ 839 if(i%64==0) cout<<endl; 840 cout<<miwen[i]; 841 } 842 cout<<endl<<endl; 843 cout<<"秘钥为:"; 844 for(int i=0;i<64;i++){ 845 if(i%64==0) cout<<endl; 846 cout<<miyao[i]; 847 } 848 cout<<endl<<endl; 849 cout<<"明文为:"; 850 for(int i=0;i<64;i++){ 851 if(i%64==0) cout<<endl; 852 cout<<mingwen[i]; 853 } 854 //是否将明文转换成十六进制?(Y or N) 855 856 cout<<endl<<endl<<"是否将明文转换成十六进制?(Y or N):"; 857 char YN; 858 cin>>YN; 859 cout<<endl<<"十六进制明表示:"; 860 if(YN==‘Y‘){ 861 for(int i=0;i<16;i++){ 862 int q=mingwen[i*4]*8+mingwen[i*4+1]*4+mingwen[i*4+2]*2+mingwen[i*4+3]; 863 if(q>=0 && q<= 9){ 864 cout<<q; 865 } 866 else{ 867 cout<<hex<<uppercase<<q; 868 } 869 } 870 } 871 cout<<endl<<endl<<"!!!!皆大欢喜,普天同庆!!!!"<<endl; 872 return 0; 873 } 874 875 int main(){ 876 877 878 while(1){ 879 int number; 880 cout<<"===欢迎来到DES加密算法系统==="<<endl; 881 cout<<" Author:十七"<<endl; 882 cout<<"目前支持的操作有:"<<endl; 883 cout<<" 1.加密操作;"<<endl; 884 cout<<" 2.解密操作;"<<endl; 885 cout<<" 0.退出。"<<endl; 886 cout<<"============================="<<endl; 887 cout<<"请选择您项进行的操作:"; 888 cin>>number; 889 cout<<endl; 890 891 if(number==1){ 892 jiami(); 893 } 894 else if(number==2){ 895 jiemi(); 896 } 897 else{ 898 cout<<"您已成功退出系统,如果您对本次服务感到满意,欢迎五星好评^_^"<<endl; 899 return 0; 900 } 901 } 902 return 0; 903 }
......
......
原文:https://www.cnblogs.com/msq2000/p/12702859.html