?? des.c
字號:
//////////////////////////////////////////////////////////////////////////////
// ************************** //
// *Data Encryption Standard* //
// ************************** //
// //
// Realized in C //
// //
// ************* //
// *Constructed* //
// * By * //
// * * //
// *Xie Xingwei* //
// ************* //
// //
// If you have any question about my code,contact me with E-mail please //
// //
// xiexingwei_2008@hotmail.com //
//////////////////////////////////////////////////////////////////////////////
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
#include "data_struct.h"
/*16 48-bit subkeys*/
extern struct SUBKEYSTRUCT subkey1;
extern struct SUBKEYSTRUCT subkey2;
extern struct SUBKEYSTRUCT subkey3;
extern struct SUBKEYSTRUCT subkey4;
extern struct SUBKEYSTRUCT subkey5;
extern struct SUBKEYSTRUCT subkey6;
extern struct SUBKEYSTRUCT subkey7;
extern struct SUBKEYSTRUCT subkey8;
extern struct SUBKEYSTRUCT subkey9;
extern struct SUBKEYSTRUCT subkey10;
extern struct SUBKEYSTRUCT subkey11;
extern struct SUBKEYSTRUCT subkey12;
extern struct SUBKEYSTRUCT subkey13;
extern struct SUBKEYSTRUCT subkey14;
extern struct SUBKEYSTRUCT subkey15;
extern struct SUBKEYSTRUCT subkey16;
int des(unsigned char *buffer)
{
/*Some variables for DES computation*/
int i,x;
struct BLOCK4L temp4L;
struct BLOCK4S *ptemp4S;
unsigned char temp[4];
unsigned char temp1[4];
struct BLOCK32S *ptemp1;
unsigned char tempbuffer[8];
struct BLOCK64S *ptempbuffer;
struct SUBKEYSTRUCT *subkey;/*Pointer of subkeys*/
struct BLOCK64S *pbuffer;/*Pointer of plaintext/ciphertext storage*/
struct SUBKEYSTRUCT EPbuffer; /*Used for expansion/permutation*/
unsigned char redbuffer[4];/*Left part of the buffer*/
unsigned char bluebuffer[4];/*Right part of the buffer*/
struct BLOCK32S8 *pbluebuffer;
struct BLOCK32L *leftpart; /*Pointer of the left part*/
struct BLOCK32S *rightpart;/*Pointer of the right part*/
struct BLOCK32L *rightpart1;
struct BLOCK2S row; /*Used for locating the data in the S-Boxes*/
struct BLOCK4S col; /*Used for locating the data in the S-Boxes*/
struct BLOCK2L *prow;
struct BLOCK4L *pcol;
/*Definition of 8 DES S-Boxes*/
unsigned S1[4][16]={{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}};
unsigned S2[4][16]={{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}};
unsigned S3[4][16]={{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}};
unsigned S4[4][16]={{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}};
unsigned S5[4][16]={{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}};
unsigned S6[4][16]={{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}};
unsigned S7[4][16]={{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}};
unsigned S8[4][16]={{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}};
/*Pointer initialization*/
pbuffer=(struct BLOCK64S *)buffer;
ptempbuffer=(struct BLOCK64S *)tempbuffer;
leftpart=(struct BLOCK32L *)redbuffer;
pbluebuffer=(struct BLOCK32S8 *)bluebuffer;
rightpart=(struct BLOCK32S *)bluebuffer;
rightpart1=(struct BLOCK32L *)bluebuffer;
prow=(struct BLOCK2L *)(&row);
pcol=(struct BLOCK4L *)(&col);
ptemp1=(struct BLOCK32S *)(&temp1);
ptemp4S=(struct BLOCK4S *)(&temp4L);
/*Make plaintext data into proper order*/
for(i=0;i<8;i++)
{
tempbuffer[i]=buffer[i];
}
pbuffer->bit0=ptempbuffer->bit7; pbuffer->bit1=ptempbuffer->bit6;
pbuffer->bit2=ptempbuffer->bit5; pbuffer->bit3=ptempbuffer->bit4;
pbuffer->bit4=ptempbuffer->bit3; pbuffer->bit5=ptempbuffer->bit2;
pbuffer->bit6=ptempbuffer->bit1; pbuffer->bit7=ptempbuffer->bit0;
pbuffer->bit8=ptempbuffer->bit15; pbuffer->bit9=ptempbuffer->bit14;
pbuffer->bit10=ptempbuffer->bit13;pbuffer->bit11=ptempbuffer->bit12;
pbuffer->bit12=ptempbuffer->bit11;pbuffer->bit13=ptempbuffer->bit10;
pbuffer->bit14=ptempbuffer->bit9; pbuffer->bit15=ptempbuffer->bit8;
pbuffer->bit16=ptempbuffer->bit23;pbuffer->bit17=ptempbuffer->bit22;
pbuffer->bit18=ptempbuffer->bit21;pbuffer->bit19=ptempbuffer->bit20;
pbuffer->bit20=ptempbuffer->bit19;pbuffer->bit21=ptempbuffer->bit18;
pbuffer->bit22=ptempbuffer->bit17;pbuffer->bit23=ptempbuffer->bit16;
pbuffer->bit24=ptempbuffer->bit31;pbuffer->bit25=ptempbuffer->bit30;
pbuffer->bit26=ptempbuffer->bit29;pbuffer->bit27=ptempbuffer->bit28;
pbuffer->bit28=ptempbuffer->bit27;pbuffer->bit29=ptempbuffer->bit26;
pbuffer->bit30=ptempbuffer->bit25;pbuffer->bit31=ptempbuffer->bit24;
pbuffer->bit32=ptempbuffer->bit39;pbuffer->bit33=ptempbuffer->bit38;
pbuffer->bit34=ptempbuffer->bit37;pbuffer->bit35=ptempbuffer->bit36;
pbuffer->bit36=ptempbuffer->bit35;pbuffer->bit37=ptempbuffer->bit34;
pbuffer->bit38=ptempbuffer->bit33;pbuffer->bit39=ptempbuffer->bit32;
pbuffer->bit40=ptempbuffer->bit47;pbuffer->bit41=ptempbuffer->bit46;
pbuffer->bit42=ptempbuffer->bit45;pbuffer->bit43=ptempbuffer->bit44;
pbuffer->bit44=ptempbuffer->bit43;pbuffer->bit45=ptempbuffer->bit42;
pbuffer->bit46=ptempbuffer->bit41;pbuffer->bit47=ptempbuffer->bit40;
pbuffer->bit48=ptempbuffer->bit55;pbuffer->bit49=ptempbuffer->bit54;
pbuffer->bit50=ptempbuffer->bit53;pbuffer->bit51=ptempbuffer->bit52;
pbuffer->bit52=ptempbuffer->bit51;pbuffer->bit53=ptempbuffer->bit50;
pbuffer->bit54=ptempbuffer->bit49;pbuffer->bit55=ptempbuffer->bit48;
pbuffer->bit56=ptempbuffer->bit63;pbuffer->bit57=ptempbuffer->bit62;
pbuffer->bit58=ptempbuffer->bit61;pbuffer->bit59=ptempbuffer->bit60;
pbuffer->bit60=ptempbuffer->bit59;pbuffer->bit61=ptempbuffer->bit58;
pbuffer->bit62=ptempbuffer->bit57;pbuffer->bit63=ptempbuffer->bit56;
/*Initial permutation*/
for(i=0;i<8;i++)
{
tempbuffer[i]=buffer[i];
}
pbuffer->bit0=ptempbuffer->bit57; pbuffer->bit1=ptempbuffer->bit49;
pbuffer->bit2=ptempbuffer->bit41; pbuffer->bit3=ptempbuffer->bit33;
pbuffer->bit4=ptempbuffer->bit25; pbuffer->bit5=ptempbuffer->bit17;
pbuffer->bit6=ptempbuffer->bit9; pbuffer->bit7=ptempbuffer->bit1;
pbuffer->bit8=ptempbuffer->bit59; pbuffer->bit9=ptempbuffer->bit51;
pbuffer->bit10=ptempbuffer->bit43;pbuffer->bit11=ptempbuffer->bit35;
pbuffer->bit12=ptempbuffer->bit27;pbuffer->bit13=ptempbuffer->bit19;
pbuffer->bit14=ptempbuffer->bit11;pbuffer->bit15=ptempbuffer->bit3;
pbuffer->bit16=ptempbuffer->bit61;pbuffer->bit17=ptempbuffer->bit53;
pbuffer->bit18=ptempbuffer->bit45;pbuffer->bit19=ptempbuffer->bit37;
pbuffer->bit20=ptempbuffer->bit29;pbuffer->bit21=ptempbuffer->bit21;
pbuffer->bit22=ptempbuffer->bit13;pbuffer->bit23=ptempbuffer->bit5;
pbuffer->bit24=ptempbuffer->bit63;pbuffer->bit25=ptempbuffer->bit55;
pbuffer->bit26=ptempbuffer->bit47;pbuffer->bit27=ptempbuffer->bit39;
pbuffer->bit28=ptempbuffer->bit31;pbuffer->bit29=ptempbuffer->bit23;
pbuffer->bit30=ptempbuffer->bit15;pbuffer->bit31=ptempbuffer->bit7;
pbuffer->bit32=ptempbuffer->bit56;pbuffer->bit33=ptempbuffer->bit48;
pbuffer->bit34=ptempbuffer->bit40;pbuffer->bit35=ptempbuffer->bit32;
pbuffer->bit36=ptempbuffer->bit24;pbuffer->bit37=ptempbuffer->bit16;
pbuffer->bit38=ptempbuffer->bit8; pbuffer->bit39=ptempbuffer->bit0;
pbuffer->bit40=ptempbuffer->bit58;pbuffer->bit41=ptempbuffer->bit50;
pbuffer->bit42=ptempbuffer->bit42;pbuffer->bit43=ptempbuffer->bit34;
pbuffer->bit44=ptempbuffer->bit26;pbuffer->bit45=ptempbuffer->bit18;
pbuffer->bit46=ptempbuffer->bit10;pbuffer->bit47=ptempbuffer->bit2;
pbuffer->bit48=ptempbuffer->bit60;pbuffer->bit49=ptempbuffer->bit52;
pbuffer->bit50=ptempbuffer->bit44;pbuffer->bit51=ptempbuffer->bit36;
pbuffer->bit52=ptempbuffer->bit28;pbuffer->bit53=ptempbuffer->bit20;
pbuffer->bit54=ptempbuffer->bit12;pbuffer->bit55=ptempbuffer->bit4;
pbuffer->bit56=ptempbuffer->bit62;pbuffer->bit57=ptempbuffer->bit54;
pbuffer->bit58=ptempbuffer->bit46;pbuffer->bit59=ptempbuffer->bit38;
pbuffer->bit60=ptempbuffer->bit30;pbuffer->bit61=ptempbuffer->bit22;
pbuffer->bit62=ptempbuffer->bit14;pbuffer->bit63=ptempbuffer->bit6;
/*Break buffer into two parts*/
for(i=0;i<4;i++)
{
redbuffer[i]=buffer[i];
bluebuffer[i]=buffer[i+4];
}
for(x=0;x<16;x++)
{
for(i=0;i<4;i++)
{
temp[i]=bluebuffer[i];
}
/*Expation and permutation*/
EPbuffer.k0=rightpart->bit31; EPbuffer.k1=rightpart->bit0;
EPbuffer.k2=rightpart->bit1; EPbuffer.k3=rightpart->bit2;
EPbuffer.k4=rightpart->bit3; EPbuffer.k5=rightpart->bit4;
EPbuffer.k6=rightpart->bit3; EPbuffer.k7=rightpart->bit4;
EPbuffer.k8=rightpart->bit5; EPbuffer.k9=rightpart->bit6;
EPbuffer.k10=rightpart->bit7; EPbuffer.k11=rightpart->bit8;
EPbuffer.k12=rightpart->bit7; EPbuffer.k13=rightpart->bit8;
EPbuffer.k14=rightpart->bit9; EPbuffer.k15=rightpart->bit10;
EPbuffer.k16=rightpart->bit11;EPbuffer.k17=rightpart->bit12;
EPbuffer.k18=rightpart->bit11;EPbuffer.k19=rightpart->bit12;
EPbuffer.k20=rightpart->bit13;EPbuffer.k21=rightpart->bit14;
EPbuffer.k22=rightpart->bit15;EPbuffer.k23=rightpart->bit16;
EPbuffer.k24=rightpart->bit15;EPbuffer.k25=rightpart->bit16;
EPbuffer.k26=rightpart->bit17;EPbuffer.k27=rightpart->bit18;
EPbuffer.k28=rightpart->bit19;EPbuffer.k29=rightpart->bit20;
EPbuffer.k30=rightpart->bit19;EPbuffer.k31=rightpart->bit20;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -