projects
/
my-code
/
crypto.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ecb mode working, still bug in cbc mode.
[my-code/crypto.git]
/
des.c
diff --git
a/des.c
b/des.c
index
4c0a358
..
a001060
100644
(file)
--- a/
des.c
+++ b/
des.c
@@
-5,9
+5,10
@@
*
*/
*
*/
+#include <string.h>
#include "des.h"
#include "des.h"
-u8 key_perm_table[DES_
SUB
KEY_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,
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,121
+73,129
@@
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}
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,
2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25
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
-};
+};
-
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;
-}
+
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_left(u8 *obj,int len) {
- int i=0;
- u8 tmp=obj[0];
- for(i=0;i<len-1;i++) obj[i]=obj[i]<<1|(obj[j+1]>>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;
}
return 1;
}
-key_perm(u8 *key) {
+int rotate_left(u8 *obj) {
+ u8 mid=obj[3],tmp=obj[0];
int i;
int i;
- u8 new[DES_INITIAL_KEY_LEN/8];
- memset(new,0,DES_INITIAL_KEY_LEN/8];
- for(i=0;i<DES_INITIAL_KEY_LEN;i++)
- new[i/8]|=((((key[(key_perm_table[i]-1)/8)]>>((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;
}
return 1;
}
-int
subkey_trans(u8 *key,int round
) {
+int
table_trans(u8 *src,u8 *final,u8 *table,int len
) {
int i;
int i;
- for(i=0;i<rot_per_round_table[round];i++) {
- rotate_left(key,DES_INITIAL_KEY_LEN/(8*2));
- rotate_left(key+DES_INITIAL_KEY_LEN/(8*2),DES_INITIAL_KEY_LEN/(8*2));
- }
- return 1;
+ memset(final,0,len/8);
+ for(i=0;i<len;i++)
+ final[i/8]|=((((src[(table[i]-1)/8])>>((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;
int i;
- memset(pc,0,DES_SUBKEY_LEN/8);
- for(i=0;i<DES_SUBKEY_LEN;i++)
- pc[i/8]|=((((key[subkey_perm_table[i]-1)/8]>>((8-subkey_perm_table[i]%8)&7))&1)<<(7-i%8));
+ for(i=0;i<rot_per_round_table[round];i++)
+ rotate_left(key);
return 1;
}
return 1;
}
-int compute_subkeys(u8 *key0,u8
**subkey
) {
+int compute_subkeys(u8 *key0,u8
subkey[DES_SUBKEYS][DES_SUBKEY_LEN/8]
) {
int i;
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<DES_SUBKEYS;i++) {
for(i=0;i<DES_SUBKEYS;i++) {
- subkey_trans(key0;i);
- subkey_perm(key0,subkey[i]);
+ /* split and rotate key_056 */
+ subkey_trans(key0_56,i);
+ /* chose 48 bits as a subkey */
+ table_trans(key0_56,subkey[i],subkey_perm_table,DES_SUBKEY_LEN);
}
return 1;
}
}
return 1;
}
-int data_perm(u8 *plain,u8 *pd) {
- int i;
- memset(pd,0,DES_DATA_BLOCK_LEN/8);
- for(i=0;i<DES_DATA_BLOCK_LEN;i++)
- pd[i/8]|=((((plain[data_perm_table[i]-1)/8]>>((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<DES_SUBKEY_LEN;i++)
- expanded[i/8]|=((((right[data_expansion_table[i]-1)/8]>>((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_s_and_p(u8 *data) {
int data_s_and_p(u8 *data) {
- u8 s[DES_DATA_BLOCK_LEN/2];
- u8 p[DES_DATA_BLOCK_LEN/2];
- int i,j;
- for(i=0;i<DES_SBOXES;i++)
- s[i]=get_sbox_value(data,i*(DES_SUBKEY_LEN/DES_SBOXES),(DES_SUBKEY_LEN/DES_SBOXES),i);
-
+ u8 s[DES_DATA_BLOCK_LEN/(8*2)];
+ memset(s,0,DES_DATA_BLOCK_LEN/(8*2));
+ s[0]=sbox[0][16*(((data[0]&0x80)>>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;
}
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;
int i,j;
- u8 p
d[DES_DATA_BLOCK_LEN
];
+ u8 p
ermuted_data[DES_DATA_BLOCK_LEN/8
];
u8 left[DES_DATA_BLOCK_LEN/(2*8)];
u8 right[DES_DATA_BLOCK_LEN/(2*8)];
u8 left[DES_DATA_BLOCK_LEN/(2*8)];
u8 right[DES_DATA_BLOCK_LEN/(2*8)];
- u8
expanded[DES_SUBKEY_LEN
];
+ u8
tmp[DES_DATA_BLOCK_LEN/(2*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<DES_SUBKEYS;i++){
for(i=0;i<DES_SUBKEYS;i++){
- data_expansion_perm(right,expanded);
- for(j=0;j<DES_SUBKEY_LEN;j++) expanded[j]^=subkey[mode&MODE_CRYPT?i:DES_SUBKEYS-1-i][j];
- data_s_and_p(expanded);
-
+ /* expand right data to 48 bit */
+ table_trans(right,permuted_data,data_expansion_table,DES_SUBKEY_LEN);
+ /* xor with subkey */
+ for(j=0;j<DES_SUBKEY_LEN/8;j++) permuted_data[j]^=subkey[mode&MODE_CRYPT?i:DES_SUBKEYS-1-i][j];
+ /* sbox substitutions and pbox permutations */
+ data_s_and_p(permuted_data);
+ /* xor with left data */
+ if(i!=15) {
+ memcpy(tmp,right,DES_DATA_BLOCK_LEN/(2*8));
+ for(j=0;j<DES_DATA_BLOCK_LEN/(2*8);j++)
+ right[j]=permuted_data[j]^left[j];
+ /* switch left and right data - not for last round */
+ memcpy(left,tmp,DES_DATA_BLOCK_LEN/(2*8));
+ }
+ else
+ for(j=0;j<DES_DATA_BLOCK_LEN/(2*8);j++) left[j]^=permuted_data[j];
}
}
-
+ /* merge and do final permutation */
+ memcpy(permuted_data,left,DES_DATA_BLOCK_LEN/(2*8));
+ memcpy(permuted_data+DES_DATA_BLOCK_LEN/(2*8),right,DES_DATA_BLOCK_LEN/(8*2));
+ table_trans(permuted_data,crypted,data_final_perm_table,DES_DATA_BLOCK_LEN);
return 1;
}
return 1;
}
-int des_crypt_decrypt(u8 *
plain,u8 *crypted
,u8 *key,int len,u8 mode) {
+int des_crypt_decrypt(u8 *
src,u8 *final
,u8 *key,int len,u8 mode) {
u8 subkey[DES_SUBKEYS][DES_SUBKEY_LEN/8];
u8 subkey[DES_SUBKEYS][DES_SUBKEY_LEN/8];
- int i;
-
+ int i,j;
/* compute the subkeys:
- initial key transformation: 64bit -> 56bit
- obtain subkeys by:
/* compute the subkeys:
- initial key transformation: 64bit -> 56bit
- obtain subkeys by:
@@
-210,19
+219,22
@@
int des_crypt_decrypt(u8 *plain,u8 *crypted,u8 *key,int len,u8 mode) {
- loop 16 times
- do final permutation
*/
- loop 16 times
- do final permutation
*/
-
- /* for all data do: (not yet ready) */
- progress_data(plain,subkey,mode);
-
+ for(i=0;i<len/8;i++) {
+ if((mode&MODE_CBC)&&(mode&MODE_CRYPT)&&(i!=0))
+ for(j=0;j<8;j++) src[i*8+j]^=final[(i-1)*8+j];
+ progress_data(src+i*8,final+i*8,subkey,mode);
+ if((mode&MODE_CBC)&&(mode&MODE_DECRYPT)&&(i!=0))
+ for(j=0;j<8;j++) final[(i*8)+j]^=src[(i-1)*8+j];
+ }
return 1;
}
return 1;
}
-int des_
crypt(u8 *plain,u8 *crypted,u8 *key,int len,MODE_CRYPT
) {
-
+int des_
encrypt(u8 *plain,u8 *crypted,u8 *key,int len,u8 mode
) {
+ des_crypt_decrypt(plain,crypted,key,len,MODE_CRYPT|mode);
return 1;
}
return 1;
}
-int des_decrypt(u8 *crypted,u8 *plain,u8 *key,int len,
MODE_DECRYPT
) {
-
+int des_decrypt(u8 *crypted,u8 *plain,u8 *key,int len,
u8 mode
) {
+ des_crypt_decrypt(crypted,plain,key,len,MODE_DECRYPT|mode);
return 1;
}
return 1;
}