DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心。蒟蒻并不想说自己用了多久才把代码写好的。

代码:

我真的太难了QAQ

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

运行结果截图:

......

......

DES加密解密算法C++实现的更多相关文章

  1. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  2. DES加密解密算法C语言代码实现

    代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...

  3. Des加密解密算法java实现

    package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...

  4. C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

    DES加密算法 des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密 ...

  5. android -------- DES加密解密算法

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...

  6. C#MD5加密和DES加密解密算法

    public partial class stringTest : System.Web.UI.Page     {         protected void Page_Load(object s ...

  7. DES对 json 、http参数加密解密算法

    网上众多大神们的众多方式实现加解密操作及保障数据安全性.今天无意中发现一篇以 DES加密解密算法.摘抄如下 工具类: import java.security.SecureRandom; import ...

  8. 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解

    原文地址:http://docode.top/Article/Detail/10003 目录: 1..Net(C#)平台下Des加密解密源代码 2..Net(C#)平台下Aes加密解密源代码 3..N ...

  9. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

随机推荐

  1. coding++:SpringBoot-事务注解详解

    @Transactional spring 事务注解 1.简单开启事务管理 @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:ann ...

  2. C++中的各种进制转换函数汇总

    C++中的各种进制转换函数汇总 1.在C中,按指定进制格式输出如下: #include <iostream> #include <cstdio> using namespace ...

  3. Promise入门详解

    异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...

  4. 最大子矩阵hdu1559(二维前缀和)

    最大子矩阵hdu1559 Problem Description 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大. Input 输入数据的第一行为一个正整数T,表示有 ...

  5. Vertica的这些事(四)——-vertica加密数据

    通过创建 Secure Access Policies可以对vertica中的某一列数据进行加密: CREATE ACCESS POLICY ON [schema][tablename] FOR CO ...

  6. java中eclipse的安装和JDK的环境变量的配置以及记事本的使用

    2020-04-09 23:26:15 学习java的第一步当然就是环境配置了,java中的配置作为小白刚刚开始肯定会有点一点晕头转向的,开没等开始入门呢!就要准备放弃了.哈哈哈哈,没关系的,都是这么 ...

  7. springboot项目下的Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    今天遇到mybatis-puls的报错Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (n ...

  8. C#通用类库整理--日志记录

    日志的记录是将程序过程中的一些行为数据记录下来,方便开发.运维迅速的找到问题的所在,节省时间.使用时在 站点的web.config 中的<appSettings></appSetti ...

  9. C++不被继承的内容

    C++不被继承的内容 派生类会继承基类所有的方法和变量,除了: 构造函数,析构函数 重载运算符 友元函数 注意,私有成员是被继承了的,只是无法访问.我们可以通过sizeof判断出来.下面附一张清晰的图

  10. Shell:Day05.笔记

    交互输入与for语句 1.交互输入 read  Python中用input()函数,进行输入:  read命令同时可以定义多个变量值:而输入的内容默认以空格为分隔符,将值输入到对应的变量中: 如果默认 ...