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];
35 int rotate_left(u8 *obj,int len) {
38 while(len-(i++)) obj[i-1]=obj[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]/8]>>((8-key_perm_table[i]%8)%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/2);
57 rotate_left(key+DES_SUBKEY_LEN/2,DES_SUBKEY_LEN/2);
62 int fuckup_data(u8 *key,int round,u8 *plain,u8 *crypted) {
63 u8 permc[DES_PERMC_LEN];
65 for(i=0;i<DES_PERMC_LEN;i++)
66 permc[i]=key[subkey_perm_table[i]];
71 int des_crypt(u8 *plain,u8 *crypted,u8 *key) {
75 for(round=0;round<DES_ROUND;round++) {
76 subkey_trans(key,round);
77 // fuckup_data(key,round,plain,crypted);
83 int des_decrypt(u8 *crypted,u8 *plain,u8 *key) {