db0aba84e072ca4aef5b391d4a4a71d36f5309f8
[my-code/crypto.git] / des.c
1 /*
2  * des.c - data encryption standard algo
3  *
4  * author: hackbard@hackdaworld.dyndns.org
5  *
6  */
7
8 #include "des.h"
9
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
15 };
16
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
19 };
20
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
26 };
27
28 int rotate_right(u8 *obj,int len) {
29  u8 tmp=obj[len-1];
30  while(--len) obj[len]=obj[len]>>1|((obj[len-1]&1)<<7);
31  obj[0]=obj[0]>>1|((tmp&1)<<7);;
32  return 1;
33 }
34
35 int rotate_left(u8 *obj,int len) {
36  int i=0;
37  u8 tmp=obj[0];
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);
40  return 1;
41 }
42
43 key_perm(u8 *key) {
44  int i;
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);
50  return 1;
51 }
52
53 int subkey_trans(u8 *key,int round) {
54  int i;
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));
58  }
59  return 1;
60 }
61
62 int fuckup_data_block(u8 *key,int round,u8 *plain,u8 *crypted) {
63  u8 permc[DES_PERMC_LEN];
64  int i;
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));
68
69  
70  return 1;
71 }
72
73 int des_crypt(u8 *plain,u8 *crypted,u8 *key) {
74  int round;
75
76  key_perm(key);
77  for(round=0;round<DES_ROUND;round++) {
78   subkey_trans(key,round);
79   // fuckup_data(key,round,plain,crypted);
80  }
81
82  return 1;
83 }
84
85 int des_decrypt(u8 *crypted,u8 *plain,u8 *key) {
86
87
88  return 1;
89 }