X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fcrypto.git;a=blobdiff_plain;f=des.c;h=a001060759c6023d40c734fe23cc92fa95d5b7b1;hp=d71317d297a892be6203d362604664006510d829;hb=HEAD;hpb=ec19aa63a4642abfa6eb237c23ce7f9fbd710ac4 diff --git a/des.c b/des.c index d71317d..a001060 100644 --- a/des.c +++ b/des.c @@ -5,9 +5,10 @@ * */ +#include #include "des.h" -u8 key_perm_table[DES_SUBKEY_LEN]={ +u8 key_perm_table[DES_INITIAL_KEY_LEN]={ 57,49,41,33,25,17,9,1,58,50,42,34,26,18, 10,2,59,51,43,35,27,18,11,3,60,52,44,36, 63,55,47,39,31,23,15,7,62,54,46,38,30,22, @@ -72,7 +73,7 @@ u8 sbox[DES_SBOXES][DES_SBOX_LEN]={ 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} -} +}; u8 pbox[DES_PBOX_LEN]={ 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10, @@ -86,138 +87,115 @@ u8 data_final_perm_table[DES_DATA_BLOCK_LEN]={ 34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25 }; -int rotate_right(u8 *obj,int len) { - u8 tmp=obj[len-1]; - while(--len) obj[len]=obj[len]>>1|((obj[len-1]&1)<<7); - obj[0]=obj[0]>>1|((tmp&1)<<7);; - return 1; -} - -int rotate_left(u8 *obj,int len) { - int i=0; - u8 tmp=obj[0]; - for(i=0;i>7); - obj[len-1]=obj[len-1]<<1|(tmp>>7); +int rotate_right(u8 *obj) { + u8 mid=obj[3],tmp=obj[6]; + int i; + for(i=6;i>3;i++) + obj[i]=obj[i]>>1|((obj[i-1]&1)<<7); + obj[3]=(obj[3]&0xf)>>1|((tmp&1)<<3); + obj[3]|=(((obj[2]&1)<<7)|((mid&0xe0)>>1)); + for(i=2;i>0;i++) + obj[i]=obj[i]>>1|((obj[i-1]&1)<<7); + obj[0]=obj[0]>>1|((mid&0x10)<<3); return 1; } -key_perm(u8 *key) { +int rotate_left(u8 *obj) { + u8 mid=obj[3],tmp=obj[0]; int i; - u8 new[DES_INITIAL_KEY_LEN/8]; - memset(new,0,DES_INITIAL_KEY_LEN/8]; - for(i=0;i>((8-key_perm_table[i]%8)&7))&1)<<(7-i%8)); - memcpy(key,new,DES_INITIAL_KEY_LEN); + for(i=0;i<3;i++) + obj[i]=obj[i]<<1|(obj[i+1]>>7); + obj[3]=((obj[3]&0xf0)<<1)|((tmp&0x80)>>3); + obj[3]|=(((mid&7)<<1)|(obj[4]>>7)); + for(i=4;i<6;i++) + obj[i]=(obj[i]<<1)|(obj[i+1]>>7); + obj[6]=obj[6]<<1|((mid&8)>>3); return 1; } -int subkey_trans(u8 *key,int round) { +int table_trans(u8 *src,u8 *final,u8 *table,int len) { int i; - for(i=0;i>((8-(table[i])%8)&7))&1)<<(7-i%8)); + return 1; } -int subkey_perm(u8 *key,u8 *pc) { +int subkey_trans(u8 *key,int round) { int i; - memset(pc,0,DES_SUBKEY_LEN/8); - for(i=0;i>((8-subkey_perm_table[i]%8)&7))&1)<<(7-i%8)); + for(i=0;i>((8-data_perm_table[i]%8)&7))&1)<<(7-i%8)); - return 1; -} - -int data_expansion_perm(u8 *right,u8 expanded) { - int i; - memset(expanded,0,DES_SUBKEY_LEN/8); - for(i=0;i>((8-data_expansion_table[i]%8)&7))&1)<<(7-i%8)); - return 1; -} - -int get_sbox_value(u8 *data,int offset,int len,int box) { - int tmp; - tmp=((offset%8)==0)?data[offset/8]>>(8-len):((data[offset/8]&((1<<(offset%8))-1))<<(offset%8))|(data[(offset/8)+1]>>(len-(8-(offset%8)))); - return(sbox[box][(tmp&1|(tmp&(1<<(len-1))<<1))*16+(tmp&((1<<(len-1))-1)>>1)]); -} - -int data_pbox_perm(u8 *s,u8 *p) { - int i; - for(i=0;i>((8-pbox[i]%8)&7))&1)<<(7-i%8)); - return 1; -} - int data_s_and_p(u8 *data) { - u8 s[DES_DATA_BLOCK_LEN/(8*2)]; - u8 p[DES_DATA_BLOCK_LEN/(8*2)]; - int i,j; - for(i=0;i>6)|((data[0]&4)>>2))+((data[0]&0x78)>>3)]<<4; + s[0]|=sbox[1][16*((data[0]&2)|((data[1]&0x10)>>4))+(((data[0]&1)<<3)|(data[1]&0xe0)>>5)]; + s[1]=sbox[2][16*(((data[1]&8)>>2)|((data[2]&0x40)>>6))+(((data[1]&7)<<1)|((data[2]&0x80)>>7))]<<4; + s[1]|=sbox[3][16*(((data[2]&0x20)>>4)|(data[2]&1))+((data[2]&0x1e)>>1)]; + s[2]=sbox[4][16*(((data[3]&0x80)>>6)|((data[3]&4)>>2))+((data[3]&0x78)>>3)]<<4; + s[2]|=sbox[5][16*((data[3]&2)|((data[4]&0x10)>>4))+(((data[3]&1)<<3)|(data[4]&0xe0)>>5)]; + s[3]=sbox[6][16*(((data[4]&8)>>2)|((data[5]&0x40)>>6))+(((data[4]&7)<<1)|((data[5]&0x80)>>7))]<<4; + s[3]|=sbox[7][16*(((data[5]&0x20)>>4)|(data[5]&1))+((data[5]&0x1e)>>1)]; + table_trans(s,data,pbox,DES_PBOX_LEN); return 1; } -int data_final_perm(u8 *final,u8 *src) { - int i; - memset(final,0,DES_DATA_BLOCK_LEN/8); - for(i=0;i>((8-data_final_perm_table[i]%8)&7))&1)<<(7-i%8)); - return 1; -} - -int progress_data(u8 *data,u8 **subkey,u8 mode) { +int progress_data(u8 *data,u8 *crypted,u8 subkey[DES_SUBKEYS][DES_SUBKEY_LEN/8],u8 mode) { int i,j; - u8 pd[DES_DATA_BLOCK_LEN/8]; + u8 permuted_data[DES_DATA_BLOCK_LEN/8]; u8 left[DES_DATA_BLOCK_LEN/(2*8)]; u8 right[DES_DATA_BLOCK_LEN/(2*8)]; u8 tmp[DES_DATA_BLOCK_LEN/(2*8)]; - u8 expanded[DES_SUBKEY_LEN/8]; - data_perm(data,pd); - memcpy(left,pd,DES_DATA_BLOCK_LEN/(2*8)); - memcpy(right,pd+DES_DATA_BLOCK_LEN/(2*8),DES_DATA_BLOCK_LEN/(2*8)); + /* initial permutation */ + table_trans(data,permuted_data,data_perm_table,DES_DATA_BLOCK_LEN); + memcpy(left,permuted_data,DES_DATA_BLOCK_LEN/(2*8)); + memcpy(right,permuted_data+DES_DATA_BLOCK_LEN/(2*8),DES_DATA_BLOCK_LEN/(2*8)); for(i=0;i 56bit - obtain subkeys by: @@ -242,21 +220,21 @@ int des_crypt_decrypt(u8 *src,u8 *final,u8 *key,int len,u8 mode) { - do final permutation */ for(i=0;i