2 * des.c - data encryption standard algo
4 * author: hackbard@hackdaworld.dyndns.org
10 u8 key_perm_table[DES_SUBKEY_LEN]={
11 57,49,41,33,25,17,9,1,58,50,42,34,26,18,
12 10,2,59,51,43,35,27,18,11,3,60,52,44,36,
13 63,55,47,39,31,23,15,7,62,54,46,38,30,22,
14 14,6,61,53,45,37,29,21,13,5,28,20,12,4
17 u8 rot_per_round_table[DES_ROUNDS]={
18 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
21 u8 subkey_perm_table[DES_PERMC_LEN]={
22 14,17,11,24,1,5,3,28,15,6,21,10,
23 23,19,12,4,26,8,16,7,27,20,13,2,
24 41,52,31,37,47,55,30,40,51,45,33,48,
25 44,49,39,56,34,53,46,42,50,36,29,32
28 int rotate_right(u8 *obj,int len) {
30 while(--len) obj[len]=obj[len]>>1|((obj[len-1]&1)<<7);
31 obj[0]=obj[0]>>1|((tmp&1)<<7);;
35 int rotate_left(u8 *obj,int len) {
38 for(i=0;i<len-1;i++) obj[i]=obj[i]<<1|(obj[j+1]>>7);
39 obj[len-1]=obj[len-1]<<1|(tmp>>7);
45 u8 *new[DES_SUBKEY_LEN/8];
46 memset(new,0,DES_SUBKEY_LEN/8];
47 for(i=0;i<DES_SUBKEY_LEN;i++)
48 new[i/8]|=(((key[(key_perm_table[i]-1)/8)]>>((8-key_perm_table[i]%8)&7))&1)<<(7-i%8));
49 memcpy(key,new,DES_SUBKEY_LEN);
53 int subkey_trans(u8 *key,int round) {
55 for(i=0;i<rot_per_round_table[round];i++) {
56 rotate_left(key,DES_SUBKEY_LEN/(8*2));
57 rotate_left(key+DES_SUBKEY_LEN/(8*2),DES_SUBKEY_LEN/(8*2));
62 int fuckup_data_block(u8 *key,int round,u8 *plain,u8 *crypted) {
63 u8 permc[DES_PERMC_LEN];
65 memset(permc,0,DES_PERMC_LEN/8);
66 for(i=0;i<DES_PERMC_LEN;i++)
67 permc[i/8]|=(((key[(subkey_perm_table[i]-1)/8]>>((8-subkey_perm_table[i]%8)&7)&1))<<(7-i%8));
73 int des_crypt(u8 *plain,u8 *crypted,u8 *key) {
77 for(round=0;round<DES_ROUND;round++) {
78 subkey_trans(key,round);
79 // fuckup_data(key,round,plain,crypted);
85 int des_decrypt(u8 *crypted,u8 *plain,u8 *key) {