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

📄 des.c

📁 包括BASE64编码的C语言实现,DES加密的C实现,共享内存,信号量的C实现
💻 C
字号:
#include "des.h"#include "stdio.h"#include "memory.h"/* initial permutation IP */const static char ip_table[64] = {	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};/* final permutation IP^-1 */const static char ipr_table[64] = {	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};/* expansion operation matrix */static const char e_table[48] = {	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};/* 32-bit permutation function P used on the output of the S-boxes */const static char p_table[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};/* permuted choice table (key) */const static char pc1_table[56] = {	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};/* permuted choice key (table) */const static char pc2_table[48] = {	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};/* number left rotations of pc1 */const static char loop_table[16] = {	1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};/* The (in)famous S-boxes */const static char s_box[8][4][16] = {	/* 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} 	}};typedef	bool (*psubkey)[16][48];static void stddes(char ob[8], char ib[8], const psubkey psk, bool type);static void setkey(const char *key, int len);static void setsubkey(psubkey psk, const char key[8]);static void f_func(bool ib[32], const bool ki[48]);static void s_func(bool ob[32], const bool in[48]);static void transform(bool *ob, bool *ib, const char *table, int len);static void x_or(bool *in1, const bool *in2, int len);static void rotatel(bool *ib, int len, int loop);static void byte2bit(bool *ob, const char *ib, int bytes);static void bit2byte(char *ob, const bool *ib, int bits);static bool subkey[2][16][48];static bool is3des;static char tmp[256], deskey[16];/* des encrypt */bool des_encrypt(char *ib, int il, char *ob, int ol, char *key, int kl){	long i=0;	long j=0;	if (ib == NULL || ob == NULL || key == NULL)		return false;		il = ((il+7)/8)*8;	printf("key: %s kenlen: %d\n", key, kl);	printf("ib:\n");	printhex(ib, il);	printf("ob:\n");	printhex(ob, ol);	j = il >> 3;	setkey(key, kl);	if (!is3des)	{		for(i=0; i<j; i++, ob+=8, ib+=8)		{			stddes(ob, ib, &subkey[0], true);		}	}	else	{		for(i=0; i<j; i++, ob+=8, ib+=8)		{			stddes(ob, ib, &subkey[0], true);			stddes(ob, ob, &subkey[1], false);			stddes(ob, ob, &subkey[0], true);		}	}		return true;}/* des decrypt */bool des_decrypt(char *ib, int il, char *ob, int ol, char *key, int kl){	printf("key: %s keylen: %d\n", key, kl);	printf("ib:\n");	printhex(ib, il);		printf("ob:\n");	printhex(ob, ol);		long i=0;        long j=0;                                                                                                                                     if (ib == NULL || ob == NULL || key == NULL)                return false;                                                                                                                             	il = ((il+7)/8)*8;        j = il >> 3;        setkey(key, kl);        if (!is3des)        {                for(i=0; i<j; i++, ob+=8, ib+=8)                {                        stddes(ob, ib, &subkey[0], false);                }        }        else        {                for(i=0; i<j; i++, ob+=8, ib+=8)                {                        stddes(ob, ib, &subkey[0], false);                        stddes(ob, ob, &subkey[1], true);                        stddes(ob, ob, &subkey[0], false);                }        }                                                                                                                                     return true;}/* set des key */void setkey(const char *key, int len){	memset(deskey, 0, sizeof(deskey));	memcpy(deskey, key, len>16 ? 16 : len); 	setsubkey(&subkey[0], &deskey[0]);	if (len > 8)	{		setsubkey(&subkey[1], &deskey[8]);		is3des = true;	}	else		is3des = false;	}/* std des */void stddes(char ob[8], char ib[8], const psubkey psk, bool type){        printf("ib:\n");        printhex(ib, 8);        printf("ob:\n");        printhex(ob, 8);	static bool m[64];	static bool tmp[32];	static bool *li = &m[0];	static bool *ri = &m[32];	byte2bit(m, ib, 64);	transform(m, m, ip_table, 64);		/* encrypt */	if (type)	{		for(int i=0; i<16; i++)		{			memcpy(tmp, ri, 32);			f_func(ri, (*psk)[i]);			x_or(ri, li, 32);			memcpy(li, tmp, 32);		}	}	else	{		for(int i=15; i>=0; --i)		{			memcpy(tmp, li, 32);			f_func(li, (*psk)[i]);			x_or(li, ri, 32);			memcpy(ri, tmp, 32);		}	}	transform(m, m, ipr_table, 64);	bit2byte(ob, m, 64);}/* set subkey */void setsubkey(psubkey psk, const char key[8]){	static bool k[64];	static bool *kl=&k[0];	static bool *kr=&k[28];		byte2bit(k, key, 64);	transform(k, k, pc1_table, 56);	for(int i=0; i<16; i++)	{		rotatel(kl, 28, loop_table[i]);		rotatel(kr, 28, loop_table[i]);		transform((*psk)[i], k, pc2_table, 48);	}}/* f_function */void f_func(bool ib[32], const bool ki[48]){	static bool mr[48];		transform(mr, ib, e_table, 48);	x_or(mr, ki, 48);	s_func(ib, mr);	transform(ib, ib, p_table, 32);}/* s_function */void s_func(bool ob[32], const bool ib[48]){	char i=0;	char j;	char k;		for(i=0; i<8; ++i, ib+=6, ob+=4)	{		j = (ib[0]<<1) + ib[5];		k = (ib[1]<<3) + (ib[2]<<2) + (ib[3]<<1) + ib[4];		byte2bit(ob, &s_box[i][j][k], 4);	} }/* transform */void transform(bool *ob, bool *ib, const char *table, int len){	for(int i=0; i<len; ++i)	{		tmp[i] = ib[table[i]-1];	}	memcpy(ob, tmp, len);}/* x_or */void x_or(bool *ib1, const bool *ib2, int len){	for(int i=0; i<len; ++i)	{		ib1[i] ^= ib2[i];	}}/* rotate left */void rotatel(bool *ib, int len, int loop){	memcpy(tmp, ib, loop);	memcpy(ib, ib+loop, len-loop);	memcpy(ib+len-loop, tmp, loop); }/* byte to bit */void byte2bit(bool *ob, const char* ib, int bytes){	for(int i=0; i<bytes; ++i)	{		ob[i] = (ib[i>>3]>>(i&7)) & 1;	}}/* bit to byte */void bit2byte(char *ob, const bool *ib, int bits){	memset(ob, 0, bits>>3);	for(int i=0; i<bits; i++)	{		ob[i>>3] |= ib[i] << (i&7);	}}/* print with hex  */void printhex(const char *s, int len){	for(int i=0; i<len; i++)	{		printf("%08x ", s[i]);		if ((i+1) % 10 == 0)			printf("\n");	}	printf("\n");}

⌨️ 快捷键说明

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