X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fcrypto.git;a=blobdiff_plain;f=des.c;h=d26ae60cb820ec1b79c23b69cc2666e66e5d6c54;hp=4c0a358218f22e269cbfc4b7b42f1dcd3211a433;hb=967ba6ad8f3dbdf974e29e92badcd25af47baf6f;hpb=ac304c536726578d9276356343594dc015c34415 diff --git a/des.c b/des.c index 4c0a358..d26ae60 100644 --- a/des.c +++ b/des.c @@ -77,7 +77,14 @@ u8 sbox[DES_SBOXES][DES_SBOX_LEN]={ u8 pbox[DES_PBOX_LEN]={ 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 -}; +}; + +u8 data_final_perm_table[DES_DATA_BLOCK_LEN]={ + 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 +}; int rotate_right(u8 *obj,int len) { u8 tmp=obj[len-1]; @@ -94,13 +101,11 @@ int rotate_left(u8 *obj,int len) { return 1; } -key_perm(u8 *key) { +int table_trans(u8 *src,u8 *final,u8 *table,int len) { 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); + memset(final,0,len/8); + for(i=0;i>((8-table[i]%8)&7))&1)<<(7-i%8)); return 1; } @@ -113,40 +118,20 @@ int subkey_trans(u8 *key,int round) { return 1; } -int subkey_perm(u8 *key,u8 *pc) { - int i; - memset(pc,0,DES_SUBKEY_LEN/8); - for(i=0;i>((8-subkey_perm_table[i]%8)&7))&1)<<(7-i%8)); - return 1; -} - int compute_subkeys(u8 *key0,u8 **subkey) { int i; - key_perm(key0); + u8 key0_56[DES_INITIAL_KEY_LEN/8]; + /* initial permutation of key */ + table_trans(key0,key0_56,key_perm_table,DES_INITIAL_KEY_LEN); 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); - 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)))); @@ -154,37 +139,49 @@ int get_sbox_value(u8 *data,int offset,int len,int box) { } int data_s_and_p(u8 *data) { - u8 s[DES_DATA_BLOCK_LEN/2]; - u8 p[DES_DATA_BLOCK_LEN/2]; + u8 s[DES_DATA_BLOCK_LEN/(8*2)]; int i,j; for(i=0;i