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

📄 deskey.c

📁 DES加密解密源代码
💻 C
字号:


#include "des.h" 
#include "podd.h"
#include "sk.h"   
#include <string.h>


#define ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n)))) 

#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
	(b)^=(t),\
	(a)^=((t)<<(n)))

#define c2l(c,l)        (l =((DES_LONG)(*((c)++)))    , \
			 l|=((DES_LONG)(*((c)++)))<< 8, \
			 l|=((DES_LONG)(*((c)++)))<<16, \
			 l|=((DES_LONG)(*((c)++)))<<24)


static int check_parity(des_cblock (*key));

int des_check_key=0;

void des_set_odd_parity(des_cblock* key)
{
	int i;

	for (i=0; i<DES_KEY_SZ; i++)
		(*key)[i]=odd_parity[(*key)[i]];
}

static int check_parity(des_cblock* key)
{
	int i;

	for (i=0; i<DES_KEY_SZ; i++)
		{
		if ((*key)[i] != odd_parity[(*key)[i]])
			return(0);
		}
	return(1);
}

/* Weak and semi week keys as take from
 * %A D.W. Davies
 * %A W.L. Price
 * %T Security for Computer Networks
 * %I John Wiley & Sons
 * %D 1984
 * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
 * (and actual cblock values).
 */
#define NUM_WEAK_KEY    16
static des_cblock weak_keys[NUM_WEAK_KEY]={
	/* weak keys */
	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
	{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
	{0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
	/* semi-weak keys */
	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};

int des_is_weak_key(des_cblock* key)
{
	int i;

	for (i=0; i<NUM_WEAK_KEY; i++)
		if (memcmp(weak_keys[i],key,sizeof(des_cblock)) == 0) return(1);
	return(0);
}

#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
	(a)=(a)^(t)^(t>>(16-(n))))

/******************************************************************************/
/*     des_set_key                                                            */
/*          This function determines the 32 sub-keys used by DES during each  */
/*          of the sixteen rounds.  This function also checks for odd parity  */
/*          (correct) and for weak keys.  It returns 0 if there is no error,  */
/*          -1 if there is a key parity error and -2 if the inputted key is a */
/*          weak key.                                                         */
/******************************************************************************/
int des_set_key(des_cblock* key, volatile des_key_schedule schedule)
{
	register DES_LONG c,d,t,s,t2;
	register unsigned char *in;
	register DES_LONG *k;
	register int i;

	if (des_check_key)
	{
		if (!check_parity(key))
			return(-1);

		if (des_is_weak_key(key))
			return(-2);
	}

	k=(DES_LONG *)schedule;
	in=(unsigned char *)key;

	c2l(in,c);
	c2l(in,d);


	PERM_OP (d,c,t,4,0x0f0f0f0f);
	HPERM_OP(c,t,-2,0xcccc0000);
	HPERM_OP(d,t,-2,0xcccc0000);
	PERM_OP (d,c,t,1,0x55555555);
	PERM_OP (c,d,t,8,0x00ff00ff);
	PERM_OP (d,c,t,1,0x55555555);
	d=      (((d&0x000000ff)<<16)| (d&0x0000ff00L)     |
		 ((d&0x00ff0000)>>16)|((c&0xf0000000)>>4));
	c&=0x0fffffff;

 
 	c=(((c>>1)|(c<<27))&0x0fffffff); /* shifts2: 1-2  */
	d=(((d>>1)|(d<<27))&0x0fffffff);
	s=      des_skb[0][ (c    )&0x3f                ]|
		des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
		des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
		des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
					  ((c>>22)&0x38)];
	t=      des_skb[4][ (d    )&0x3f                ]|
		des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
		des_skb[6][ (d>>15)&0x3f                ]|
		des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

	/* table contained 0213 4657 */
	t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
	*(k++)=ROTATE(t2,30)&0xffffffff;

	t2=((s>>16)|(t&0xffff0000));
	*(k++)=ROTATE(t2,26)&0xffffffff;   

	c=(((c>>1)|(c<<27))&0x0fffffff); /* shifts2: 1-2  */
	d=(((d>>1)|(d<<27))&0x0fffffff);
	s=      des_skb[0][ (c    )&0x3f                ]|
		des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
		des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
		des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
					  ((c>>22)&0x38)];
	t=      des_skb[4][ (d    )&0x3f                ]|
		des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
		des_skb[6][ (d>>15)&0x3f                ]|
		des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

	t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
	*(k++)=ROTATE(t2,30)&0xffffffff;

	t2=((s>>16)|(t&0xffff0000));
	*(k++)=ROTATE(t2,26)&0xffffffff;

	c=(((c>>1)|(c<<27))&0x0fffffff); /* shifts2: 1-2  */
	d=(((d>>1)|(d<<27))&0x0fffffff);
	s=      des_skb[0][ (c    )&0x3f                ]|
		des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
		des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
		des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
					  ((c>>22)&0x38)];
	t=      des_skb[4][ (d    )&0x3f                ]|
		des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
		des_skb[6][ (d>>15)&0x3f                ]|
		des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

	t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
	*(k++)=ROTATE(t2,30)&0xffffffff;

	t2=((s>>16)|(t&0xffff0000));
	*(k++)=ROTATE(t2,26)&0xffffffff;		
	
	for (i=0; i<6; i++)
	{
		c=(((c>>2)|(c<<26))&0x0fffffff); /* shifts2: 3-8  */
		d=(((d>>2)|(d<<26))&0x0fffffff);
		s=      des_skb[0][ (c    )&0x3f                ]|
			des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
			des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
			des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
						  ((c>>22)&0x38)];
		t=      des_skb[4][ (d    )&0x3f                ]|
			des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
			des_skb[6][ (d>>15)&0x3f                ]|
			des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

		/* table contained 0213 4657 */
		t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
		*(k++)=ROTATE(t2,30)&0xffffffff;

		t2=((s>>16)|(t&0xffff0000));
		*(k++)=ROTATE(t2,26)&0xffffffff;
	
	}
	
	c=(((c>>1)|(c<<27))&0x0fffffff); /* shifts2: 9 */
	d=(((d>>1)|(d<<27))&0x0fffffff);
	s=      des_skb[0][ (c    )&0x3f                ]|
		des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
		des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
		des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
					  ((c>>22)&0x38)];
	t=      des_skb[4][ (d    )&0x3f                ]|
		des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
		des_skb[6][ (d>>15)&0x3f                ]|
		des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

	/* table contained 0213 4657 */
	t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
	*(k++)=ROTATE(t2,30)&0xffffffff;

	t2=((s>>16)|(t&0xffff0000));
	*(k++)=ROTATE(t2,26)&0xffffffff;
	
	for (i=0; i<6; i++)
	{
		c=(((c>>2)|(c<<26))&0x0fffffff); /* shifts2: 10-15  */
		d=(((d>>2)|(d<<26))&0x0fffffff);
		s=      des_skb[0][ (c    )&0x3f                ]|
			des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
			des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
			des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
						  ((c>>22)&0x38)];
		t=      des_skb[4][ (d    )&0x3f                ]|
			des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
			des_skb[6][ (d>>15)&0x3f                ]|
			des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

		t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
		*(k++)=ROTATE(t2,30)&0xffffffff;

		t2=((s>>16)|(t&0xffff0000));
		*(k++)=ROTATE(t2,26)&0xffffffff;
	
	}
	
	c=(((c>>1)|(c<<27))&0x0fffffff); /* shifts2: 16 */
	d=(((d>>1)|(d<<27))&0x0fffffff);
	s=      des_skb[0][ (c    )&0x3f                ]|
		des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
		des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
		des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
					  ((c>>22)&0x38)];
	t=      des_skb[4][ (d    )&0x3f                ]|
		des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
		des_skb[6][ (d>>15)&0x3f                ]|
		des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];

	t2=((t<<16)|(s&0x0000ffff))&0xffffffff;
	*(k++)=ROTATE(t2,30)&0xffffffff;

	t2=((s>>16)|(t&0xffff0000));
	*(k++)=ROTATE(t2,26)&0xffffffff;
	
	return(0);
}







⌨️ 快捷键说明

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