📄 udes.c
字号:
/****************************************/
/*PROGRAM:udes.C */
/* DES function on UNIX */
/*By Dongshifang */
/****************************************/
#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<string.h>
#include <signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/termio.h>
typedef unsigned char uchar;
//typedef unsigned short ushort;
void endes(uchar src[8],uchar pwd[8],uchar cipher[8]);
void undes(uchar cipher[8],uchar pwd[8],uchar src[8]);
void generate_key(uchar inkey[8],uchar outkey[17][6]);
void fun_encode(uchar a[4],uchar k[6],uchar outstr[4]);
void x_matrix(uchar *instr,const uchar *index,uchar *outstr,uchar outstr_bits);
const uchar index_org1[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
};
const uchar index_org2[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
};
const uchar index_org3[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
};
const uchar index_org4[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 uchar tab_org[8][64]=
{
{//1
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
},
{//2
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
},
{//3
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
},
{//4
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
},
{//5
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
},
{//6
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
},
{//7
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
},
{//8
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
}
};
const uchar index_key11[28]=
{
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
};
const uchar index_key12[28]=
{
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 uchar index_key20[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
};
const uchar index_rotate[16]=
{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
void endes(uchar src[8],uchar pwd[8],uchar cipher[8])
{
uchar xstr[8],i,j;
uchar org[17][8],key[17][6];
//1:Gen 16 KEY
generate_key(pwd,key);
//2:org replace
x_matrix(src,index_org1,org[0],64);
for(i=0;i<16;i++)
{
//3:Gen next org left
memmove(org[i+1],org[i]+4,4);
//4:call encode function
fun_encode(org[i]+4,key[i+1],xstr);
//5:XOR ,form Last org[i+1] right
for(j=0;j<4;j++)
org[i+1][j+4]=xstr[j]^org[i][j];
}//for(i)
//6:exchange org left and right
memcpy(xstr,org[16]+4,4);
memcpy(xstr+4,org[16],4);
//7:displace cipher
x_matrix(xstr,index_org2,cipher,64);
}
void undes(uchar cipher[8],uchar pwd[8],uchar src[8])
{
uchar xstr[8],j;
char i;
uchar org[17][8],key[17][6];
//1:Gen 16 KEY
generate_key(pwd,key);
//2:org displace
x_matrix(cipher,index_org1,org[16],64);
//3:exchange org left and right
memcpy(xstr,org[16]+4,4);
memcpy(xstr+4,org[16],4);
memcpy(org[16],xstr,8);
for(i=15;i>=0;i--)
{
//4:Gen last org right
memcpy(org[i]+4,org[i+1],4);
//5:call encode function
fun_encode(org[i+1],key[i+1],xstr);
//6:XOR ,form Last org[i] left
for(j=0;j<4;j++)
org[i][j]=xstr[j]^org[i+1][j+4];
}//for(i)
//replace cipher
x_matrix(org[0],index_org2,src,64);
}
void fun_encode(uchar a[4],uchar k[6],uchar outstr[4])
{
uchar m,n,cc,j,xstr[8],resp[8];
ushort tmpu;
//1:org select,from 32 bits to 48 bits
x_matrix(a,index_org3,xstr,48);
//2:XOR org and k
for(j=0;j<6;j++)
resp[j]=xstr[j]^k[j];
//3:last select,from 48 bits to 32 bits
for(j=0;j<8;j++)
{
//get 6 bits from 48 bits resp
tmpu=(ushort)(resp[j*6/8]<<8)+resp[j*6/8+1];
xstr[j]=(tmpu<<(j*6%8))>>8;
}
for(j=0;j<8;j++)
{
cc=xstr[j];
//fetch VALUE from tab_org
m=((cc>>6)&0x02)+((cc>>2)&0x01);
n=(cc>>3)&0x0f;
cc=m*16+n;
xstr[j]=tab_org[j][cc];
}//for(j)
//4:form 32 bits outstr--32 bits
for(j=0;j<4;j++)
resp[j]=(xstr[2*j]<<4)+(xstr[2*j+1]&0x0f);
//5:replace org right
x_matrix(resp,index_org4,outstr,32);
}
void generate_key(uchar inkey[8],uchar outkey[17][6])
{
uchar resp[8],xstr[6],c[17][4],d[17][4],i,cc;
long tmpl;
//shift key
memcpy(resp,inkey,8);
/*
for(i=0;i<8;i++)
{
for(j=1,m=0;j<8;j++)
if((inkey[i]>>(j-1))&0x01)m++;
resp[i]=(inkey[i]<<1)+m%2;
}
*/
//1:select 28 bits--c[i]
x_matrix(resp,index_key11,c[0],28);
//2:select 28 bits--d[i]
x_matrix(resp,index_key12,d[0],28);
for(i=0;i<16;i++)
{
//3:rotate c[i] and d[i]
tmpl=((long)c[i][0]<<24)+((long)c[i][1]<<16)
+((long)c[i][2]<< 8)+ (long)(c[i][3]&0xf0);
tmpl<<=index_rotate[i];
c[i+1][1]=tmpl>>16;
c[i+1][2]=tmpl>> 8;
c[i+1][3]=tmpl&0xf0;
c[i+1][0]=tmpl>>24;
tmpl=((long)d[i][0]<<24)+((long)d[i][1]<<16)
+((long)d[i][2]<< 8)+ (long)(d[i][3]&0xf0);
tmpl<<=index_rotate[i];
d[i+1][1]=tmpl>>16;
d[i+1][2]=tmpl>> 8;
d[i+1][3]=tmpl&0xf0;
d[i+1][0]=tmpl>>24;
c[i+1][3]|=(c[i][0]>>(8-index_rotate[i]))<<4;
d[i+1][3]|=(d[i][0]>>(8-index_rotate[i]))<<4;
//4:form 56 bits--resp
memcpy(resp,c[i+1],3);
resp[3]=(c[i+1][3]&0xf0)+(d[i+1][0]>>4);
resp[4]=(d[i+1][0]<<4)+(d[i+1][1]>>4);
resp[5]=(d[i+1][1]<<4)+(d[i+1][2]>>4);
resp[6]=(d[i+1][2]<<4)+(d[i+1][3]>>4);
//5:select 48 bits key[i]
x_matrix(resp,index_key20,xstr,48);
memcpy(outkey[i+1],xstr,6);
}//for(i)
}
void x_matrix(uchar *instr,const uchar *index,uchar *outstr,uchar outstr_bits)
{
uchar i,cc;
if(outstr_bits%8)
memset(outstr,0x00,outstr_bits/8+1);
else
memset(outstr,0x00,outstr_bits/8);
for(i=0;i<outstr_bits;i++)
{
cc=instr[(index[i]-1)/8] << (index[i]-1)%8;
cc&=0x80;
if(cc)
outstr[i/8]+=cc >> i%8;
}//for
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -