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

📄 scr.cpp

📁 des密码简单实现
💻 CPP
字号:
#include "des.h" 
const static char Ip[64] =             //初始置换(IP)
 {
	58, 50, 42, 34, 26, 18, 10, 2,
	60, 52, 44, 36, 28, 20, 12, 4,
	62, 54, 46, 38, 30, 22, 14, 6, 
	64, 56, 48, 40, 32, 24, 16, 8,
	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
};

const static char Ipr[64] =               //逆初始置换(IPR)
{
	40, 8, 48, 16, 56, 24, 64, 32, 
	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
};


static const char E[48] =                //扩充置换(E)
{
	32, 1,  2,  3,  4,  5, 
	4,  5,  6,  7,  8,  9,
	8,  9, 10, 11, 12, 13,
	12, 13, 14, 15, 16, 17,
	16, 17, 18, 19, 20, 21,
  20, 21, 22, 23, 24, 25,
	24, 25, 26, 27, 28, 29,
	28, 29, 30, 31, 32, 1
};

const static char P[32] = 
{
	16, 7, 20, 21,
	29, 12, 28, 17, 
	1,  15, 23, 26,
	5,  18, 31, 10,
	2,  8, 24, 14, 
	32, 27, 3,  9, 
	19, 13, 30, 6,
	22, 11, 4,  25
};

const static char PC1[56] =                  // 密钥置换选择表PC-1
{
	57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
	10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
	63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
	14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
};

const static char PC2[48] =                  //密钥置换选择表PC-2
{
	 14, 17, 11, 24,  1,  5, 
	 3, 28, 15,  6, 21, 10,
	 23, 19, 12,  4, 26,  8, 
	 16,  7, 27, 20, 13,  2,
	 41, 52, 31, 37, 47, 55, 
	 30, 40, 51, 45, 33, 48,
	 44, 49, 39, 56, 34, 53, 
	 46, 42, 50, 36, 29, 32
};

const static char LOOP[16] =               //循环左移次数运算表
{

	1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};


const static char S_Box[8][4][16] =           //S盒运算 
{
//盒S1 
	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,
//盒S2 
    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,
//盒S3 
  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,
//盒S4 
  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,
//盒S5 
  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,
//盒S6 
  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,
//盒S7 
  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,
//盒S8 
   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
};
static char tran_key[8],Tmp[256];
typedef bool   (*PSubKey)[16][48];
bool SubKey[16][48];
void get_loop16_key(const char *key,int len)
{
	static bool Key_temp[64], *left_key=&Key_temp[0], *right_key=&Key_temp[28];
	memset(tran_key, 0, 8);
	int now_len=len>8?8:len;
    memcpy(tran_key,key, now_len);
	for(int i=0; i<64; i++)                  //字节到位的转换
        Key_temp[i] = (key[i>>3]>>(i&7)) & 1;
	
    Transform_table(Key_temp,Key_temp,PC1, 56);
    
	for(int i=0; i<16; ++i) 
	{
        int loop_k=LOOP[i];
           
	   memcpy(Tmp,left_key, loop_k);  
       memcpy(left_key, left_key+loop_k, 28-loop_k);
       memcpy(left_key+28-loop_k, Tmp, loop_k);
       
	   memcpy(Tmp,right_key, loop_k);  ///
		memcpy(right_key, right_key+loop_k, 28-loop_k);
		memcpy(right_key+28-loop_k, Tmp, loop_k);
		
		Transform_table(SubKey[i],Key_temp, PC2, 48);
	}
}

void Transform_table(bool key_out[48],bool *key_in,const char *table,int len)
{
	for(int i=0; i<len; ++i)
        Tmp[i] = key_in[ table[i]-1 ];
    memcpy(key_out,Tmp,len);
}
void Xor(bool *InA, const bool *InB, int len)
{
    for(int i=0; i<len; ++i)
        InA[i] ^= InB[i];
}
void S_func(bool Out[32], const bool In[48])
{
    for(char i=0,j,k; i<8; ++i,In+=6,Out+=4) {
        j = (In[0]<<1) + In[5];
        k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];
		ByteToBit(Out, &S_Box[i][j][k], 4);
    }
}
void DES(char Out[8], char In[8], bool SubKey[16][48], int Type)
{
    static bool M[64], tmp[32], *Left=&M[0], *Right=&M[32];
    ByteToBit(M, In, 64);
    Transform_table(M, M, Ip, 64);
    if( Type == 0 ){
		//进行16轮迭代进行加密
        for(int i=0; i<16; ++i) {
            memcpy(tmp, Right, 32);
            F_func(Right, SubKey[i]);
            Xor(Right, Left, 32);
            memcpy(Left, tmp, 32);
        }
    }
	else
	{
		//进行16轮逆迭代进行解密
        for(int i=15; i>=0; --i) {
            memcpy(tmp, Left, 32);
            F_func(Left, SubKey[i]);
            Xor(Left, Right, 32);
            memcpy(Right, tmp, 32);
        }
	}
    Transform_table(M, M, Ipr, 64);
    BitToByte(Out, M, 64);
}
void BitToByte(char *Out, const bool *In, int bits)
{
    memset(Out, 0, bits>>3);
    for(int i=0; i<bits; ++i)  //没八个位和并为一个字符
        Out[i>>3] |= In[i]<<(i&7);
}
void F_func(bool In[32], const bool Ki[48])
{
    static bool MR[48];
    Transform_table(MR, In, E, 48);
    Xor(MR, Ki, 48);
    S_func(In, MR);
    Transform_table(In, In, P, 32);
}
bool Des_RDes1(char *Out, char *In, long datalen, const char *Key, int keylen,int Type)
{
    long i=0,j=(datalen+7)/8;
	get_loop16_key(Key, keylen);
	
	for(; i<j; ++i,Out+=8,In+=8)
		DES(Out, In,SubKey, Type);
	
	return true;
}
void ByteToBit(bool *Out, const char *In, int bits)
{
   
    for(int i=0; i<bits; ++i)
        Out[i] = (In[i>>3]>>(i&7)) & 1;//通过移位获取每一个字符的第一个位的值
}

⌨️ 快捷键说明

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