-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeistel.c
104 lines (73 loc) · 1.66 KB
/
feistel.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#define ROUNDS 2
/* subkeys */
#define K1 0xaa /* 1010 1010 */
#define K2 0xf0 /* 1111 0000 */
/* subblocks */
#define DATA1 0xbcaf /*1011 1100 1010 1111 */
#define DATA2 0xe6b9
typedef uint8_t u8;
typedef uint16_t u16;
/* for rounds 1 .. (n-1) */
void rounds(u8 *l, u8 *r, u8 k)
{
u8 tmp;
tmp = *r;
*r = *l ^ *r ^ k;
*l = tmp;
}
/* for round n (final round) */
void final(u8 *l, u8 *r, u8 k)
{
u8 tmp;
tmp = *r;
*l = *l ^ *r ^ k;
*r = tmp;
}
void feistel(u16 *data, u8 count, u8 k[])
{
u8 l = (u8) (*data >> 8);
u8 r = (u8) *data;
u8 i;
printf("---\n");
printf("l = 0x%02x\n", l);
printf("r = 0x%02x\n", r);
for (i = 0; i < count-1; i++)
{
printf("key = 0x%02x\n", k[i]);
rounds(&l, &r, k[i]);
printf("l = 0x%02x\n", l);
printf("r = 0x%02x\n", r);
printf("---\n");
}
printf("key = 0x%02x\n", k[i]);
final(&l, &r, k[i]);
printf("l = 0x%02x\n", l);
printf("r = 0x%02x\n", r);
u16 cipher = (l << 8) | r;
printf("c = 0x%04x (%d)\n", cipher, cipher);
}
int main(int argc, char *argv[])
{
if (argc != 3 || (*argv[1] != 'd' && *argv[1] != 'e') ) {
printf("usege: %s [ed]\n", argv[0]);
return -1;
}
u16 data = (u16) atol(argv[2]);
if (*argv[1] == 'e') {
u8 keys[2] = {K1, K2};
printf("data = 0x%02x (%d)\n", data, data);
printf("k1 = 0x%02x\n", keys[0]);
printf("k2 = 0x%02x\n", keys[1]);
feistel(&data, ROUNDS, keys);
} else {
u8 keys[2] = {K2, K1};
printf("data = 0x%02x (%d)\n", data, data);
printf("k1 = 0x%02x\n", keys[0]);
printf("k2 = 0x%02x\n", keys[1]);
feistel(&data, ROUNDS, keys);
}
return 0;
}