📄 deskey.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 + -