des.cpp
来自「一个C++的DES算法源码.引入工程中即可使用」· C++ 代码 · 共 484 行 · 第 1/2 页
CPP
484 行
0x20001000L,0x30001000L,0x20011000L,0x30011000L,
0x20001004L,0x30001004L,0x20011004L,0x30011004L,
0x00101000L,0x10101000L,0x00111000L,0x10111000L,
0x00101004L,0x10101004L,0x00111004L,0x10111004L,
0x20101000L,0x30101000L,0x20111000L,0x30111000L,
0x20101004L,0x30101004L,0x20111004L,0x30111004L,
},{
/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
0x00000000L,0x08000000L,0x00000008L,0x08000008L,
0x00000400L,0x08000400L,0x00000408L,0x08000408L,
0x00020000L,0x08020000L,0x00020008L,0x08020008L,
0x00020400L,0x08020400L,0x00020408L,0x08020408L,
0x00000001L,0x08000001L,0x00000009L,0x08000009L,
0x00000401L,0x08000401L,0x00000409L,0x08000409L,
0x00020001L,0x08020001L,0x00020009L,0x08020009L,
0x00020401L,0x08020401L,0x00020409L,0x08020409L,
0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
},{
/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
0x00000000L,0x00000100L,0x00080000L,0x00080100L,
0x01000000L,0x01000100L,0x01080000L,0x01080100L,
0x00000010L,0x00000110L,0x00080010L,0x00080110L,
0x01000010L,0x01000110L,0x01080010L,0x01080110L,
0x00200000L,0x00200100L,0x00280000L,0x00280100L,
0x01200000L,0x01200100L,0x01280000L,0x01280100L,
0x00200010L,0x00200110L,0x00280010L,0x00280110L,
0x01200010L,0x01200110L,0x01280010L,0x01280110L,
0x00000200L,0x00000300L,0x00080200L,0x00080300L,
0x01000200L,0x01000300L,0x01080200L,0x01080300L,
0x00000210L,0x00000310L,0x00080210L,0x00080310L,
0x01000210L,0x01000310L,0x01080210L,0x01080310L,
0x00200200L,0x00200300L,0x00280200L,0x00280300L,
0x01200200L,0x01200300L,0x01280200L,0x01280300L,
0x00200210L,0x00200310L,0x00280210L,0x00280310L,
0x01200210L,0x01200310L,0x01280210L,0x01280310L,
},{
/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
0x00000000L,0x04000000L,0x00040000L,0x04040000L,
0x00000002L,0x04000002L,0x00040002L,0x04040002L,
0x00002000L,0x04002000L,0x00042000L,0x04042000L,
0x00002002L,0x04002002L,0x00042002L,0x04042002L,
0x00000020L,0x04000020L,0x00040020L,0x04040020L,
0x00000022L,0x04000022L,0x00040022L,0x04040022L,
0x00002020L,0x04002020L,0x00042020L,0x04042020L,
0x00002022L,0x04002022L,0x00042022L,0x04042022L,
0x00000800L,0x04000800L,0x00040800L,0x04040800L,
0x00000802L,0x04000802L,0x00040802L,0x04040802L,
0x00002800L,0x04002800L,0x00042800L,0x04042800L,
0x00002802L,0x04002802L,0x00042802L,0x04042802L,
0x00000820L,0x04000820L,0x00040820L,0x04040820L,
0x00000822L,0x04000822L,0x00040822L,0x04040822L,
0x00002820L,0x04002820L,0x00042820L,0x04042820L,
0x00002822L,0x04002822L,0x00042822L,0x04042822L,
}};
union fudge { DES_LONG l; unsigned short s[2]; unsigned char c[4]; };void DES(char *key,char *s_text,char *d_text){ des_key_schedule sch; des_set_key((des_cblock *)key,sch); des_ecb_encrypt((des_cblock *)s_text,(des_cblock *)d_text,&(sch[0]),1);}void _DES(char *key,char *s_text,char *d_text){ des_key_schedule sch; des_set_key((des_cblock *)key,sch); des_ecb_encrypt((des_cblock *)s_text,(des_cblock *)d_text,&(sch[0]),0);}
void DES3(char *key,char *s_text,char *d_text)
{
char tmp_text1[20],tmp_text2[20];
DES(key,s_text,tmp_text1);
_DES(key+8,tmp_text1,tmp_text2);
DES(key,tmp_text2,d_text);
}
int des_set_key(des_cblock(*key),des_key_schedule schedule){ register DES_LONG c,d,t,s; register unsigned char *in; register DES_LONG *k; register int i; k=(DES_LONG *)schedule; in=(unsigned char *)key; c2l(in,c); c2l(in,d); PERM_OP (d,c,t,4,0x0f0f0f0fL); HPERM_OP(c,t,-2,0xcccc0000L); HPERM_OP(d,t,-2,0xcccc0000L); PERM_OP (d,c,t,1,0x55555555L); PERM_OP (c,d,t,8,0x00ff00ffL); PERM_OP (d,c,t,1,0x55555555L); d= (((d&0x000000ffL)<<16L)| (d&0x0000ff00L) | ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L)); c&=0x0fffffffL; for (i=0; i<16; i++) { if (shifts2[i]) { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); } else { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); } c&=0x0fffffffL; d&=0x0fffffffL; s= des_skb[0][ (c )&0x3f ]| des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]| des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]| des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) | ((c>>22L)&0x38)]; t= des_skb[4][ (d )&0x3f ]| des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]| des_skb[6][ (d>>15L)&0x3f ]| des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)]; /* table contained 0213 4657 */ *(k++)=((t<<16L)|(s&0x0000ffffL))&0xffffffffL; s= ((s>>16L)|(t&0xffff0000L)); s=(s<<4L)|(s>>28L); *(k++)=s&0xffffffffL; } return(0);}void des_ecb_encrypt(des_cblock(*input), des_cblock(*output), des_key_schedule ks,int encrypt){ register DES_LONG l; register unsigned char *in,*out; DES_LONG ll[2]; in=(unsigned char *)input; out=(unsigned char *)output; c2l(in,l); ll[0]=l; c2l(in,l); ll[1]=l; des_encrypt(ll,ks,encrypt); l=ll[0]; l2c(l,out); l=ll[1]; l2c(l,out); l=ll[0]=ll[1]=0;}void des_encrypt(DES_LONG *data, des_key_schedule ks, int encrypt){ DES_LONG l,r,u;//*** for XENIX delay *** char delay_str[2]; union fudge U,T; int i; DES_LONG *s; u=data[0]; r=data[1]; IP(u,r); l=(r<<1)|(r>>31); r=(u<<1)|(u>>31); /* clear the top bits on machines with 8byte longs */ l&=0xffffffffL; r&=0xffffffffL; s=(DES_LONG *)ks; if (encrypt) { for (i=0; i<32; i+=4) {//*** for XENIX delay *** strcpy(delay_str,""); D_ENCRYPT(l,r,i+0,&U,&T,s); /* 1 */ D_ENCRYPT(r,l,i+2,&U,&T,s); /* 2 */ } } else { for (i=30; i>0; i-=4) {//*** for XENIX delay *** strcpy(delay_str,""); D_ENCRYPT(l,r,i-0,&U,&T,s); /* 16 */ D_ENCRYPT(r,l,i-2,&U,&T,s); /* 15 */ } } l=(l>>1)|(l<<31); r=(r>>1)|(r<<31); /* clear the top bits on machines with 8byte longs */ l&=0xffffffffL; r&=0xffffffffL; FP(r,l); data[0]=l; data[1]=r;}
void calc_mac(char *rbuff,int len,char *sbuff)
{
char buffer[1000];//="<AP><JYM>8301</JYM><XTGZSJH>000002</XTGZSJH><ZDJBH>88777001</ZDJBH><CZYBH>010000</CZYBH><TCND>20</TCND><GWYTCED>060005</GWYTCED><TSBZTCED>999900</TSBZTCED><GRZFUJE>000060</GRZFUJE></AP>";
char Data[1000];
char DesData[1000];
char key[1000];
int length;
int i,j;
//strcpy(rbuff,"<AP><JYM>8301</JYM><XTGZSJH>000002</XTGZSJH><ZDJBH>88777001</ZDJBH><CZYBH>010000</CZYBH><TCND>20</TCND><GWYTCED>060005</GWYTCED><TSBZTCED>999900</TSBZTCED><GRZFUJE>000060</GRZFUJE></AP>");
//len=185;
memset(key,0x88,8);//
memset(buffer,0x00,sizeof(buffer));
memcpy(buffer,rbuff,len);
length=(len+7)/8*8;
for (i=0;i<8;i++)//first ^
Data[i]=buffer[i]^0;
for(j=0;j<length/8-1;j++)//other ^
for (i=0;i<8;i++)
Data[j*8+i+8]=buffer[j*8+i+8]^Data[j*8+i];
DES(key,Data+length-8,DesData);
memcpy(sbuff,DesData,8);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?