⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des1.cpp

📁 用尽可能少的代码实现DES密码算法的加密、解密功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DES1.cpp : Defines the entry point for the console application.
//

#include "iostream.h"
#include"stdio.h"
#define Round 16
#define N 24

                                                                        //IP置换表
	static unsigned char IP[64]={57,49,41,33,25,17,9,1,
		                         59,51,43,35,27,19,11,3,
                                 61,53,45,37,29,21,13,5,
								 63,55,47,39,31,23,15,7,
                                 56,48,40,32,24,16,8,0,
								 58,50,42,34,26,18,10,2,
	                             60,52,44,36,28,20,12,4,
								 62,54,46,38,30,22,14,6};
	                                                                   //Expand 扩展表
	static unsigned char E[48]   =  {31, 0, 1, 2, 3, 4,
	                                  3, 4, 5, 6, 7, 8,
	                                  7, 8, 9,10,11,12,
									  11,12,13,14,15,16,
									  15,16,17,18,19,20,
								      19,20,21,22,23,24,					 
									  23,24,25,26,27,28,
									  27,28,29,30,31, 0};

                                                                                        /* INITIALIZE THE TABLES */
                                                                                        /* Table - s1 */
   static unsigned char s1[4][16] = {                                                   
    14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
    0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
    4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
    15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 };

                                                                                        /* Table - s2 */
   static unsigned char s2[4][16] = {
    15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
    3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
    0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
    13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 };

                                                                                        /* Table - s3 */
   static unsigned char s3[4][16] = {
    10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
    13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
    13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
    1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 };

                                                                                        /* Table - s4 */
   static unsigned char s4[4][16] = {
    7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
    13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
    10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
    3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 };

                                                                                        /* Table - s5 */
   static unsigned char s5[4][16] = {
    2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
    14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
    4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
    11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };

                                                                                        /* Table - s6 */
   static unsigned char s6[4][16] = {
    12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
    10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
    9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
    4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };

                                                                                        /* Table - s7 */
   static unsigned char s7[4][16] = {
    4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
    13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
    1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
    6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 };

                                                                                        /* Table - s8 */
   static unsigned char s8[4][16] = {
    13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
    1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
    7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
    2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };
                                                                      //P置换表
   static unsigned char P[32]={15,6,19,20,
	                           28,11,27,16,
							    0,14,22,25,
							    4,17,30,9,
							    1,7,23,13,
							   31,26,2, 8,
							   18,12,29,5,
							   21,10,3,24};


                                                                                        /* Table - Shift */
   static unsigned char shift[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };


                                                                                        /* Table - Binary */ /* 每四位表示一个数:0-15,用于转化s盒的输出为2进制 */
   static unsigned char binary[64] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,
                                      0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1,
                                      1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1,
                                      1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 };
                                                                              //IP逆置换表
   static unsigned char IP1[64]={39,7,47,15,55,23,63,31,
	                             38,6,46,14,54,22,62,30,
								 37,5,45,13,53,21,61,29,
								 36,4,44,12,52,20,60,28,
								 35,3,43,11,51,19,59,27,
								 34,2,42,10,50,18,58,26,
								 33,1,41,9,49,17,57,25,
								 32,0,40,8,48,16,56,24};
                                                                              //密钥PC1置换表
   static unsigned char PC1[56]={56,48,40,32,24,16, 8,
	                              0,57,49,41,33,25,17,
								  9,1,58,50,42,34,26,
								 18,10,2,59,51,43,35,
								 62,54,46,38,30,22,14,
								  6,61,53,45,37,29,21,
								 13, 5,60,52,44,36,28,
								 20,12,4,27,19,11, 3};
                                                                              //密钥PC2置换表
   static unsigned char PC2[48]={13,16,10,23, 0, 4,
	                              2,27,14, 5,20, 9,
							     22,18,11, 3,25, 7,
							     15, 6,26,19,12, 1,
							     40,51,30,36,46,54,
							     29,39,50,44,32,47,
							     43,48,38,55,33,52,
							     45,41,49,35,28,31};

void des(unsigned char *source,unsigned char * dest,unsigned char * inkey, int flg)   
                                                                                       /* ================================================================
                                                                                        des()
                                                                                        Description: DES algorithm,do encript or descript.
                                                                                        ================================================================ */
{   

    unsigned char bufout[64],kwork[56], worka[48], kn[48], buffer[64], key[64],nbrofshift, temp1, temp2;
    int valindex;
    register i, j, k, iter;
                                                                      


                                                                                        /* MAIN PROCESS */
                                                                                        /* Convert from 64-bit key into 64-byte key */ 
   for (i = 0; i < 8; i++) 
   {
      key[8*i] = ((j = *(inkey + i)) / 128) % 2;
	  key[8*i+1] = (j / 64) % 2;
      key[8*i+2] = (j / 32) % 2;
      key[8*i+3] = (j / 16) % 2;
      key[8*i+4] = (j / 8) % 2;
      key[8*i+5] = (j / 4) % 2;
      key[8*i+6] = (j / 2) % 2;
      key[8*i+7] = j % 2;
   }

                                          
                                                                                       /* Convert from 64-bit data into 64-byte data */  /* buffer是明文 */
   for (i = 0; i < 8; i++) 
   {
      buffer[8*i]   = ((j = *(source + i)) / 128) % 2;
      buffer[8*i+1] = (j / 64) % 2;
      buffer[8*i+2] = (j / 32) % 2;
      buffer[8*i+3] = (j / 16) % 2;
      buffer[8*i+4] = (j / 8) % 2;
      buffer[8*i+5] = (j / 4) % 2;
      buffer[8*i+6] = (j / 2) % 2;
      buffer[8*i+7] = j % 2;
   }

                                        

                                                                                        /* Initial Permutation of Data */   /*  数据初始IP置换  */  
      for(i=0;i<64;i++)         
         bufout[i] = buffer[IP[i]];
	                                           

                                                                                        /* Initial Permutation of Key */      /*  初始密钥生成置换PC-1  */
      for(i=0;i<56;i++)  
	      kwork[i] = key[PC1[i]];

     
                                                                                        /* 16 Iterations n轮迭代*/
 for (iter = 1; iter < Round+1; iter++) 
 {
    for(i = 0; i < 32; i++)
       buffer[i] = bufout[32+i];                                                         /*  取右边(低位)32位 r 计算f  */

                                                                                        /* Calculation of F(R, K) */
                                                                                        /* Permute - E */          /* E置换,把r由32位扩充为48位 */
    for(i=0;i<48;i++)                                                             
       worka[i] = buffer[E[i]];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -