04951d6af37cc7a5ab3cec51410b56a4ea9dde45
[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];
31  obj[0]=tmp;
32  return 1;
33 }
34
35 int rotate_left(u8 *obj,int len) {
36  int i=0;
37  u8 tmp=obj[0];
38  while(len-(i++)) obj[i-1]=obj[i];
39  obj[len-1]=tmp;
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/2);
57   rotate_left(key+DES_SUBKEY_LEN/2,DES_SUBKEY_LEN/2);
58  }
59  return 1;
60 }
61
62 int fuckup_data(u8 *key,int round,u8 *plain,u8 *crypted) {
63  u8 permc[DES_PERMC_LEN];
64  int i;
65  for(i=0;i<DES_PERMC_LEN;i++)
66   permc[i]=key[subkey_perm_table[i]];
67  
68  return 1;
69 }
70
71 int des_crypt(u8 *plain,u8 *crypted,u8 *key) {
72  int round;
73
74  key_perm(key);
75  for(round=0;round<DES_ROUND;round++) {
76   subkey_trans(key,round);
77   // fuckup_data(key,round,plain,crypted);
78  }
79
80  return 1;
81 }
82
83 int des_decrypt(u8 *crypted,u8 *plain,u8 *key) {
84
85
86  return 1;
87 }