?? mac.c
字號:
/*******************************************************************************
* (des & 3des) 加脫密 & MAC X9.8 程序 *
* 編程人員: 齊傳兵 *
*******************************************************************************/
/*******************************************************************************
* void des(int flag, unsigned char *text ,unsigned char *key ,unsigned char *result); *
* flag==1 is encrypte, 0 is decrypte *
* text, key, result: 64 bits buffer *
********************************************************************************
********************************************************************************
* void des3(int flag, unsigned char *text, unsigned char *key, unsigned char *result); *
* flag==1 is encrypte, 0 is decrypte *
* text, result: 64 bits buffer *
* key: 128 bits buffer *
********************************************************************************
********************************************************************************
* void mac(unsigned int macdatalength, unsigned char *text, unsigned char *key, unsigned char *result ); *
* macdatalength : bytes of text *
* key: 64 bits buffer *
* text: n bits buffer *
* result : 64s bit buffer *
*******************************************************************************/
unsigned char code pc_1[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};
unsigned char code pc_2[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};
unsigned char code shift[16]={1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char code ip_tab[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};
unsigned char code ip_1_tab[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};
unsigned char code e3248[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};
unsigned char code p_tab[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};
unsigned char code sbox[8][64]={
{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},
{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},
{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},
{ 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},
{ 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},
{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},
{ 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},
{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}};
unsigned char code table[64]={
0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,
0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,1,
1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,
1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1};
unsigned char code qcb[64]={
0, 16, 1, 17, 2, 18, 3, 19,
4, 20, 5, 21, 6, 22, 7, 23,
8, 24, 9, 25, 10, 26, 11, 27,
12, 28, 13, 29, 14, 30, 15, 31,
32, 48, 33, 49, 34, 50, 35, 51,
36, 52, 37, 53, 38, 54, 39, 55,
40, 56, 41, 57, 42, 58, 43, 59,
44, 60, 45, 61, 46, 62, 47, 63};
void des(int flag, unsigned char *text ,unsigned char *key ,unsigned char *result)
{
//flag==1 is encrypte, 0 is decrypte
int xdata i,j,k;
unsigned char xdata *p,*q;
unsigned char xdata ch1,ch2;
unsigned char xdata text64[64],key64[64],key56[56],c0[28],d0[28],keypc11[56],key48[16][48];
unsigned char xdata iptext[64],l0[32],r0[32],temp[32],sboxinput[48];
unsigned char xdata boxout[32], entext[64],tempresult[64];
int xdata box[8];
p=text64;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
if(*(text+i)&(1<<(7-k)))
*p++=1;
else
*p++=0;
}
p=key64;
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
if(*(key+i)&(1<<(7-k)))
*p++=1;
else
*p++=0;
}
for (i=0;i<56;i++)
key56[i]=key64[pc_1[i]-1];
for (i=0;i<28;i++)
{
c0[i]=key56[i];
d0[i]=key56[i+28];
}
for (k=0;k<16;k++)
{
for(i=0;i<shift[k];i++)
{
ch1=c0[0];
ch2=d0[0];
for(j=0;j<27;j++)
{
c0[j]=c0[j+1];
d0[j]=d0[j+1];
}
c0[27]=ch1;
d0[27]=ch2;
}
for(i=0,p=c0,q=keypc11;i<28;i++)
*q++=*p++;
for(i=0,p=d0;i<28;i++)
*q++=*p++;
for (i=0;i<48;i++)
{
if(flag==1)
key48[k][i]=keypc11[pc_2[i]-1];
else
key48[15-k][i]=keypc11[pc_2[i]-1];
}
}
for (i=0;i<64;i++)
iptext[i]=text64[ip_tab[i]-1];
for (i=0;i<32;i++)
{
l0[i]=iptext[i];
r0[i]=iptext[i+32];
}
for (k=0;k<16;k++)
{
for (i=0;i<48;i++)
sboxinput[i]=key48[k][i]^r0[e3248[i]-1];
box[0]=(sboxinput[ 0]<<5)+(sboxinput[ 1]<<4)+(sboxinput[ 2]<<3)+(sboxinput[ 3]<<2)+(sboxinput[ 4]<<1)+sboxinput[5];
box[1]=(sboxinput[ 6]<<5)+(sboxinput[ 7]<<4)+(sboxinput[ 8]<<3)+(sboxinput[ 9]<<2)+(sboxinput[10]<<1)+sboxinput[11];
box[2]=(sboxinput[12]<<5)+(sboxinput[13]<<4)+(sboxinput[14]<<3)+(sboxinput[15]<<2)+(sboxinput[16]<<1)+sboxinput[17];
box[3]=(sboxinput[18]<<5)+(sboxinput[19]<<4)+(sboxinput[20]<<3)+(sboxinput[21]<<2)+(sboxinput[22]<<1)+sboxinput[23];
box[4]=(sboxinput[24]<<5)+(sboxinput[25]<<4)+(sboxinput[26]<<3)+(sboxinput[27]<<2)+(sboxinput[28]<<1)+sboxinput[29];
box[5]=(sboxinput[30]<<5)+(sboxinput[31]<<4)+(sboxinput[32]<<3)+(sboxinput[33]<<2)+(sboxinput[34]<<1)+sboxinput[35];
box[6]=(sboxinput[36]<<5)+(sboxinput[37]<<4)+(sboxinput[38]<<3)+(sboxinput[39]<<2)+(sboxinput[40]<<1)+sboxinput[41];
box[7]=(sboxinput[42]<<5)+(sboxinput[43]<<4)+(sboxinput[44]<<3)+(sboxinput[45]<<2)+(sboxinput[46]<<1)+sboxinput[47];
p=boxout;
for (i=0;i<8;i++)
{
q=&table[sbox[i][qcb[box[i]]]<<2];
*p++=*q++;
*p++=*q++;
*p++=*q++;
*p++=*q++;
}
for (i=0;i<32;i++)
{
temp[i]=r0[i];
r0[i]=boxout[p_tab[i]-1]^l0[i];
l0[i]=temp[i];
l0[i]=temp[i];
}
}
p=entext;
for(i=0;i<32;i++)
*p++=r0[i];
for(i=0;i<32;i++)
*p++=l0[i];
for (i=0;i<64;i++)
tempresult[i]=entext[ip_1_tab[i]-1];
p=tempresult;
for(i=0;i<8;i++)
{
*(result+i)=0;
for(j=0;j<7;j++)
*(result+i)=(*(result+i)|*p++)<<1;
*(result+i)=*(result+i)|*p++;
}
}
des3(int flag, unsigned char *text, unsigned char *key, unsigned char *result)
{
//flag==1 is encrypte, 0 is decrypte
des(flag, text, key, result);
des(flag^1, result, key+8, result);
des(flag, result, key, result);
}
void mac(unsigned int macdatalength, unsigned char *text, unsigned char *key, unsigned char *result )
{
unsigned char xdata Data[8];
unsigned char xdata mac[8]={0,0,0,0,0,0,0,0};
int xdata i;
unsigned int xdata len;
if(macdatalength==0)
{
des(1, mac, key, result); //用于產生密鑰校驗值
return;
}
len=0;
while(len<macdatalength)
{
for(i=0;i<8;i++)
Data[i]=0;
for(i=0;(i<8)&&(len<macdatalength);i++,len++)
Data[i]=(*text++);
for(i=0;i<8;i++)
Data[i]^=mac[i];
des(1, Data, key, mac);
}
for(i=0;i<8;i++)
*(result+i)=mac[i];
return;
}
// for example
/*{
unsigned char key1[8]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};//{1,2,3,4,5,6,7,8};
unsigned char key2[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
unsigned char text[8]={2,3,4,5,6,7,8,9};
unsigned char result[8];
unsigned char data[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//"0123456789ABCDEF0123456789ABCDE";
unsigned char i;
des(1,text,key1,result);
des(0,result,key1,text);
// des3(1,text,key2,result);
// des3(0,text,key2,result);
// mac(strlen(data), data, key1, result);
mac(10, data, key1, result);
for(i=0;i<8;i++) printf("%d ",result[i]);
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -