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

📄 des.c

📁 c51写的DES加解密程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 */
void Data_32_To_48(unsigned char Plain_32[],unsigned char Plain_48[]){
    unsigned char i,j,deal_data;
	unsigned char index=0;
	unsigned char NewKey_index,NewKey_data;

	for (i=0;i<6;i++)			/* 6个字节作为输出*/
    	Plain_48[i]=0;
	for (i=0;i<4;i++) {			/* 总共4字节, 4*8=32 */
    	deal_data=Plain_32[i];		/* 取第i个字节 */
        for (j=0;j<8;j++) {
			if ((deal_data & 0x80)==0x80) {
    			NewKey_index=Data_32_To_48_Tab[index][0];
                NewKey_data=Data_32_To_48_Tab[index][1];
				Plain_48[NewKey_index] |= NewKey_data;

    			NewKey_index=Data_32_To_48_Tab[index][2];
                NewKey_data=Data_32_To_48_Tab[index][3];
				Plain_48[NewKey_index] |= NewKey_data;
            }
			index++;
            deal_data <<= 1;
        }
    }
}
/*
 //  0    16  07  20  21  29  12  28  17
 //  1    01  15  23  26  05  18  31  10
 //  2    02  08  24  14  32  27  03  09
 //  3    19  13  30  06  22  11  04  25
 */
static unsigned char PBox_Replace_Tab[32][2]={
	{0x01,0x80},	/* 1 */
    {0x02,0x80},	/* 2 */
    {0x02,0x02},	/* 3 */
    {0x03,0x02},	/* 4 */
    {0x01,0x08},	/* 5 */
    {0x03,0x10},	/* 6 */
    {0x00,0x40},	/* 7 */
    {0x02,0x40},	/* 8 */

    {0x02,0x01},	/* 9 */
    {0x01,0x01},	/* 10 */
    {0x03,0x04},	/* 11 */
    {0x00,0x04},	/* 12 */
    {0x03,0x40},	/* 13 */
    {0x02,0x10},	/* 14 */
	{0x01,0x40},	/* 15 */
    {0x00,0x80},	/* 16 */

    {0x00,0x01},	/* 17 */
	{0x01,0x04},	/* 18 */
    {0x03,0x80},	/* 19 */
    {0x00,0x20},	/* 20 */
    {0x00,0x10},	/* 21 */
    {0x03,0x08},	/* 22 */
    {0x01,0x20},	/* 23 */
    {0x02,0x20},	/* 24 */

    {0x03,0x01},	/* 25 */
    {0x01,0x10},	/* 26 */
    {0x02,0x04},	/* 27 */
    {0x00,0x02},	/* 28 */
    {0x00,0x08},	/* 29 */
    {0x03,0x20},	/* 30 */
    {0x01,0x02},	/* 31 */
    {0x02,0x08}		/* 32 */
};

/*
 *   P-Box 置换 32-bits ==> 32-bits
 *   转换结果由in_data[]数组继续带回去
 */
void Data_P_Box_Replace(unsigned char in_data[]) {
	unsigned char temp_data[4];
    unsigned char i,j,deal_data;
	unsigned char index=0;
	unsigned char NewKey_index,NewKey_data;

	for (i=0;i<4;i++)
    	temp_data[i]=0;
	for (i=0;i<4;i++) {			/* 总共4字节, 4*8=32 */
    	deal_data=in_data[i];		/* 取第i个字节 */
        for (j=0;j<8;j++) {
			if ((deal_data & 0x80)==0x80) {
    			NewKey_index=PBox_Replace_Tab[index][0];
                NewKey_data=PBox_Replace_Tab[index][1];
				temp_data[NewKey_index] |= NewKey_data;
            }
			index++;
            deal_data <<= 1;
        }
    }
    for (i=0;i<4;i++)
    	in_data[i]=temp_data[i];
}
/*
 *  将数组Source1[]与Source2[]异或,结果放于Source1[]中,共操作count个字节
 */
void Xor_Data(unsigned char Source1[],unsigned char Source2[],unsigned char count) {
	unsigned char i;

    for (i=0;i<count;i++)
    	Source1[i]=Source1[i] ^ Source2[i];
}

/*
 //  0    58  50  42  34  26  18  10  02
 //  1    60  52  44  36  28  20  12  04
 //  2    62  54  46  38  30  22  14  06
 //  3    64  56  48  40  32  24  16  08
 //  4    57  49  41  33  25  17  09  01
 //  5    59  51  43  35  27  19  11  03
 //  6	  61  53  45  37  29  21  13  05
 //  7    63  55  47  39  31  23  15  07
 *  明文最开始的置换,即进入十六次循环之前的置换
 */
static unsigned char Data_Init_Replace_Tab[64][2]={
	{0x04,0x01},	/* 1 */
    {0x00,0x01},	/* 2 */
    {0x05,0x01},	/* 3 */
    {0x01,0x01},	/* 4 */
    {0x06,0x01},	/* 5 */
    {0x02,0x01},	/* 6 */
    {0x07,0x01},	/* 7 */
    {0x03,0x01},	/* 8 */

    {0x04,0x02},	/* 9 */
    {0x00,0x02},	/* 10 */
    {0x05,0x02},	/* 11 */
    {0x01,0x02},	/* 12 */
    {0x06,0x02},	/* 13 */
    {0x02,0x02},	/* 14 */
	{0x07,0x02},	/* 15 */
    {0x03,0x02},	/* 16 */

    {0x04,0x04},	/* 17 */
	{0x00,0x04},	/* 18 */
    {0x05,0x04},	/* 19 */
    {0x01,0x04},	/* 20 */
    {0x06,0x04},	/* 21 */
    {0x02,0x04},	/* 22 */
    {0x07,0x04},	/* 23 */
    {0x03,0x04},	/* 24 */

    {0x04,0x08},	/* 25 */
    {0x00,0x08},	/* 26 */
    {0x05,0x08},	/* 27 */
    {0x01,0x08},	/* 28 */
    {0x06,0x08},	/* 29 */
    {0x02,0x08},	/* 30 */
    {0x07,0x08},	/* 31 */
    {0x03,0x08},	/* 32 */

    {0x04,0x10},	/* 33 */
    {0x00,0x10},	/* 34 */
    {0x05,0x10},	/* 35 */
    {0x01,0x10},	/* 36 */
    {0x06,0x10},	/* 37 */
    {0x02,0x10},	/* 38 */
    {0x07,0x10},	/* 39 */
    {0x03,0x10},	/* 40 */

    {0x04,0x20},	/* 41 */
    {0x00,0x20},	/* 42 */
    {0x05,0x20},	/* 43 */
    {0x01,0x20},	/* 44 */
    {0x06,0x20},	/* 45 */
    {0x02,0x20},	/* 46 */
    {0x07,0x20},	/* 47 */
    {0x03,0x20},	/* 48 */

    {0x04,0x40},	/* 49 */
    {0x00,0x40},	/* 50 */
    {0x05,0x40},	/* 51 */
    {0x01,0x40},	/* 52 */
    {0x06,0x40},	/* 53 */
    {0x02,0x40},	/* 54 */
    {0x07,0x40},	/* 55 */
    {0x03,0x40},	/* 56 */

    {0x04,0x80},	/* 57 */
    {0x00,0x80},	/* 58 */
    {0x05,0x80},	/* 59 */
    {0x01,0x80},	/* 60 */
    {0x06,0x80},	/* 61 */
    {0x02,0x80},	/* 62 */
    {0x07,0x80},	/* 63 */
    {0x03,0x80},	/* 64 */
};

/*
 *   待转换的数据(明文)最开始的置换 64-bits ==> 64-bits
 *   转换结果由in_data[]数组继续带回去
 */
void Data_Init_Replace(unsigned char in_data[]) {
	unsigned char temp_data[8];
    unsigned char i,j,deal_data;
	unsigned char index=0;
	unsigned char NewKey_index,NewKey_data;

	for (i=0;i<8;i++)
    	temp_data[i]=0;
	for (i=0;i<8;i++) {			/* 总共8字节(64-bits) */
    	deal_data=in_data[i];		/* 取第i个字节 */
        for (j=0;j<8;j++) {
			if ((deal_data & 0x80)==0x80) {
    			NewKey_index=Data_Init_Replace_Tab[index][0];
                NewKey_data=Data_Init_Replace_Tab[index][1];
				temp_data[NewKey_index] |= NewKey_data;
            }
			index++;
            deal_data <<= 1;
        }
    }
    for (i=0;i<8;i++)
    	in_data[i]=temp_data[i];
}

/*
 //  0    40  08  48  16  56  24  64  32
 //  1    39  07  47  15  55  23  63  31
 //  2    38  06  46  14  54  22  62  30
 //  3    37  05  45  13  53  21  61  29
 //  4    36  04  44  12  52  20  60  28
 //  5    35  03  43  11  51  19  59  27
 //  6	  34  02  42  10  50  18  58  26
 //  7    33  01  41  09  49  17  57  25
 *  最后形成密文前的置换
 */
static unsigned char Data_End_Replace_Tab[64][2]={
	{0x07,0x40},	/* 1 */
    {0x06,0x40},	/* 2 */
    {0x05,0x40},	/* 3 */
    {0x04,0x40},	/* 4 */
    {0x03,0x40},	/* 5 */
    {0x02,0x40},	/* 6 */
    {0x01,0x40},	/* 7 */
    {0x00,0x40},	/* 8 */

    {0x07,0x10},	/* 9 */
    {0x06,0x10},	/* 10 */
    {0x05,0x10},	/* 11 */
    {0x04,0x10},	/* 12 */
    {0x03,0x10},	/* 13 */
    {0x02,0x10},	/* 14 */
	{0x01,0x10},	/* 15 */
    {0x00,0x10},	/* 16 */

    {0x07,0x04},	/* 17 */
	{0x06,0x04},	/* 18 */
    {0x05,0x04},	/* 19 */
    {0x04,0x04},	/* 20 */
    {0x03,0x04},	/* 21 */
    {0x02,0x04},	/* 22 */
    {0x01,0x04},	/* 23 */
    {0x00,0x04},	/* 24 */

    {0x07,0x01},	/* 25 */
    {0x06,0x01},	/* 26 */
    {0x05,0x01},	/* 27 */
    {0x04,0x01},	/* 28 */
    {0x03,0x01},	/* 29 */
    {0x02,0x01},	/* 30 */
    {0x01,0x01},	/* 31 */
    {0x00,0x01},	/* 32 */

    {0x07,0x80},	/* 33 */
    {0x06,0x80},	/* 34 */
    {0x05,0x80},	/* 35 */
    {0x04,0x80},	/* 36 */
    {0x03,0x80},	/* 37 */
    {0x02,0x80},	/* 38 */
    {0x01,0x80},	/* 39 */
    {0x00,0x80},	/* 40 */

    {0x07,0x20},	/* 41 */
    {0x06,0x20},	/* 42 */
    {0x05,0x20},	/* 43 */
    {0x04,0x20},	/* 44 */
    {0x03,0x20},	/* 45 */
    {0x02,0x20},	/* 46 */
    {0x01,0x20},	/* 47 */
    {0x00,0x20},	/* 48 */

    {0x07,0x08},	/* 49 */
    {0x06,0x08},	/* 50 */
    {0x05,0x08},	/* 51 */
    {0x04,0x08},	/* 52 */
    {0x03,0x08},	/* 53 */
    {0x02,0x08},	/* 54 */
    {0x01,0x08},	/* 55 */
    {0x00,0x08},	/* 56 */

    {0x07,0x02},	/* 57 */
    {0x06,0x02},	/* 58 */
    {0x05,0x02},	/* 59 */
    {0x04,0x02},	/* 60 */
    {0x03,0x02},	/* 61 */
    {0x02,0x02},	/* 62 */
    {0x01,0x02},	/* 63 */
    {0x00,0x02},	/* 64 */
};

/*
 *   经过下面的转换后,密文最后形成 64-bits ==> 64-bits
 *   转换结果由in_data[]数组继续带回去
 */
void Data_End_Replace(unsigned char in_data[]) {
	unsigned char temp_data[8];
    unsigned char i,j,deal_data;
	unsigned char index=0;
	unsigned char NewKey_index,NewKey_data;

	for (i=0;i<8;i++)
    	temp_data[i]=0;
	for (i=0;i<8;i++) {			/* 总共8字节(64-bits) */
    	deal_data=in_data[i];		/* 取第i个字节 */
        for (j=0;j<8;j++) {
			if ((deal_data & 0x80)==0x80) {
    			NewKey_index=Data_End_Replace_Tab[index][0];
                NewKey_data=Data_End_Replace_Tab[index][1];
				temp_data[NewKey_index] |= NewKey_data;
            }
			index++;
            deal_data <<= 1;
        }
    }
    for (i=0;i<8;i++)
    	in_data[i]=temp_data[i];
}


/*
 *  加密时每次循环密码向左移动位数表
 */
static unsigned char EncrypKeyRotateTimesTab[]={
	1,1,2,2,2,2,2,2,
    1,2,2,2,2,2,2,1
};
/*
 *  加密程序
 */
extern void Encryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
	unsigned char Key_56[7],Key_48[6];
	unsigned char temp[8];
    char i,j;

    Key64_To_56(Key_64,Key_56);			/* 得到真正的56-bits密码 */
	Data_Init_Replace(PlainTxt);		// 最开始一次置换
	for (i=0;i<16;i++) {
		for (j=0;j<4;j++)				/* 上层的右半部分直接作为下层的左半部 */
        	CipherTxt[j]=PlainTxt[4+j];	/* L(i)=L(i-1) */
        Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
        KeyRotate(Key_56,EncrypKeyRotateTimesTab[i],0);	/* rotate left */
        Key_56_To_48(Key_56,Key_48);	/* 密码压缩置换 */
        Xor_Data(temp,Key_48,6);		/* 异或6个字节 */
        S_Box_Replace(temp);			/* 48-bits ==> 32-bits */
        Data_P_Box_Replace(temp);		/* P盒置换 */
		Xor_Data(temp,PlainTxt,4);		/* 异或4个字节 */
        if (i==15) {					/* 最后一次左右不交换 */
			for (j=0;j<4;j++)
            	PlainTxt[4+j]=CipherTxt[j];
            for (j=0;j<4;j++)
                PlainTxt[j]=temp[j];
        }
        else {
	        for (j=0;j<4;j++)
    	    	PlainTxt[4+j]=temp[j];
        	for (j=0;j<4;j++)
        		PlainTxt[j]=CipherTxt[j];
        }
    }
	for (i=0;i<8;i++)
    	CipherTxt[i]=PlainTxt[i];
	Data_End_Replace(CipherTxt);	// 最后一次置换
}

/*
 *  解密时每次循环密码向右移动位数表
 */
static unsigned char DecrypKeyRotateTimesTab[]={
	0,1,2,2,2,2,2,2,
    1,2,2,2,2,2,2,1
};
/*
 *  解密程序
 */
extern void Decryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
	unsigned char Key_56[7],Key_48[6];
	unsigned char temp[8];
	char i,j;

	Key64_To_56(Key_64,Key_56);			/* 得到真正的56-bits密码 */
	Data_Init_Replace(PlainTxt);		/* 最开始一次置换 */
	for (i=0;i<16;i++) {
		for (j=0;j<4;j++)				/* 上层的右半部分直接作为下层的左半部 */
        	CipherTxt[j]=PlainTxt[4+j];	/* L(i)=L(i-1) */
        Data_32_To_48(PlainTxt+4,temp);	/* 数据从32-bits扩展到48-bits */
        KeyRotate(Key_56,DecrypKeyRotateTimesTab[i],1);	/* rotate right */
        Key_56_To_48(Key_56,Key_48);	/* 密码压缩置换 */
        Xor_Data(temp,Key_48,6);		/* 异或6个字节 */
        S_Box_Replace(temp);			/* 48-bits ==> 32-bits */
        Data_P_Box_Replace(temp);		/* P盒置换 */
		Xor_Data(temp,PlainTxt,4);		/* 异或4个字节 */
        if (i==15) {					/* 最后一次左右不交换 */
			for (j=0;j<4;j++)
            	PlainTxt[4+j]=CipherTxt[j];
            for (j=0;j<4;j++)
                PlainTxt[j]=temp[j];
        }
        else {
	        for (j=0;j<4;j++)
    	    	PlainTxt[4+j]=temp[j];
        	for (j=0;j<4;j++)
        		PlainTxt[j]=CipherTxt[j];
        }
    }
	for (i=0;i<8;i++)
    	CipherTxt[i]=PlainTxt[i];
	Data_End_Replace(CipherTxt);	// 最后一次置换
}

⌨️ 快捷键说明

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