-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathKCipher.h
145 lines (132 loc) · 25.1 KB
/
KCipher.h
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#ifndef K_CIPHER_KCIPHER_H
#define K_CIPHER_KCIPHER_H
#include <functional>
#include <iostream>
#include <cstdint>
#include <random>
#include <bitset>
#include <chrono>
#define ROTL8(x, shift) ((uint8_t) ((x) << (shift)) | ((x) >> (8 - (shift))))
#define ROTR8(x, shift) ((uint8_t) ((x) >> (shift)) | ((x) << (8 - (shift))))
using namespace std;
const int N = 24;
const int M = 8;
const int K = 96;
template<size_t size> bitset<size> operator+(bitset<size> &A, bitset<size> &B) noexcept;
template<size_t size> bitset<size> operator-(bitset<size> &A, bitset<size> &B) noexcept;
class KCipher {
public:
bitset<N> round_keys[3];
uint32_t __k_cipher_range_24_32_const_0 = 0x820390b6;
uint64_t __kcipher_range_65_128_const_0[2] = {0x5f63c0ec346ddc37, 0xf98c63bbbbefa08e};
uint64_t __kcipher_range_65_128_const_1[2] = {0x44aa7cb19f6d53a0, 0x43daa42d7323101a};
uint64_t __kcipher_range_65_128_const_2[2] = {0xb3b27e401ae99fd0, 0x84177319f57a5e1b};
uint8_t sbox[256] =
{0x63, 0x1, 0x8d, 0xf6, 0xcb, 0x52, 0x7b, 0xd1, 0xe8, 0x4f, 0x29, 0xc0, 0xb0, 0xe1, 0xe5, 0xc7,
0x74, 0xb4, 0xaa, 0x4b, 0x99, 0x2b, 0x60, 0x5f, 0x58, 0x3f, 0xfd, 0xcc, 0xff, 0x40, 0xee, 0xb2,
0x3a, 0x6e, 0x5a, 0xf1, 0x55, 0x4d, 0xa8, 0xc9, 0xc1, 0xa, 0x98, 0x15, 0x30, 0x44, 0xa2, 0xc2,
0x2c, 0x45, 0x92, 0x6c, 0xf3, 0x39, 0x66, 0x42, 0xf2, 0x35, 0x20, 0x6f, 0x77, 0xbb, 0x59, 0x19,
0x1d, 0xfe, 0x37, 0x67, 0x2d, 0x31, 0xf5, 0x69, 0xa7, 0x64, 0xab, 0x13, 0x54, 0x25, 0xe9, 0x9,
0xed, 0x5c, 0x5, 0xca, 0x4c, 0x24, 0x87, 0xbf, 0x18, 0x3e, 0x22, 0xf0, 0x51, 0xec, 0x61, 0x17,
0x16, 0x5e, 0xaf, 0xd3, 0x49, 0xa6, 0x36, 0x43, 0xf4, 0x47, 0x91, 0xdf, 0x33, 0x93, 0x21, 0x3b,
0x79, 0xb7, 0x97, 0x85, 0x10, 0xb5, 0xba, 0x3c, 0xb6, 0x70, 0xd0, 0x6, 0xa1, 0xfa, 0x81, 0x82,
0x83, 0x7e, 0x7f, 0x80, 0x96, 0x73, 0xbe, 0x56, 0x9b, 0x9e, 0x95, 0xd9, 0xf7, 0x2, 0xb9, 0xa4,
0xde, 0x6a, 0x32, 0x6d, 0xd8, 0x8a, 0x84, 0x72, 0x2a, 0x14, 0x9f, 0x88, 0xf9, 0xdc, 0x89, 0x9a,
0xfb, 0x7c, 0x2e, 0xc3, 0x8f, 0xb8, 0x65, 0x48, 0x26, 0xc8, 0x12, 0x4a, 0xce, 0xe7, 0xd2, 0x62,
0xc, 0xe0, 0x1f, 0xef, 0x11, 0x75, 0x78, 0x71, 0xa5, 0x8e, 0x76, 0x3d, 0xbd, 0xbc, 0x86, 0x57,
0xb, 0x28, 0x2f, 0xa3, 0xda, 0xd4, 0xe4, 0xf, 0xa9, 0x27, 0x53, 0x4, 0x1b, 0xfc, 0xac, 0xe6,
0x7a, 0x7, 0xae, 0x63, 0xc5, 0xdb, 0xe2, 0xea, 0x94, 0x8b, 0xc4, 0xd5, 0x9d, 0xf8, 0x90, 0x6b,
0xb1, 0xd, 0xd6, 0xeb, 0xc6, 0xe, 0xcf, 0xad, 0x8, 0x4e, 0xd7, 0xe3, 0x5d, 0x50, 0x1e, 0xb3,
0x5b, 0x23, 0x38, 0x34, 0x68, 0x46, 0x3, 0x8c, 0xdd, 0x9c, 0x7d, 0xa0, 0xcd, 0x1a, 0x41, 0x1c};
uint8_t sbox_inv[256] =
{0x0, 0x1, 0x8d, 0xf6, 0xcb, 0x52, 0x7b, 0xd1, 0xe8, 0x4f, 0x29, 0xc0, 0xb0, 0xe1, 0xe5, 0xc7,
0x74, 0xb4, 0xaa, 0x4b, 0x99, 0x2b, 0x60, 0x5f, 0x58, 0x3f, 0xfd, 0xcc, 0xff, 0x40, 0xee, 0xb2,
0x3a, 0x6e, 0x5a, 0xf1, 0x55, 0x4d, 0xa8, 0xc9, 0xc1, 0xa, 0x98, 0x15, 0x30, 0x44, 0xa2, 0xc2,
0x2c, 0x45, 0x92, 0x6c, 0xf3, 0x39, 0x66, 0x42, 0xf2, 0x35, 0x20, 0x6f, 0x77, 0xbb, 0x59, 0x19,
0x1d, 0xfe, 0x37, 0x67, 0x2d, 0x31, 0xf5, 0x69, 0xa7, 0x64, 0xab, 0x13, 0x54, 0x25, 0xe9, 0x9,
0xed, 0x5c, 0x5, 0xca, 0x4c, 0x24, 0x87, 0xbf, 0x18, 0x3e, 0x22, 0xf0, 0x51, 0xec, 0x61, 0x17,
0x16, 0x5e, 0xaf, 0x0, 0x49, 0xa6, 0x36, 0x43, 0xf4, 0x47, 0x91, 0xdf, 0x33, 0x93, 0x21, 0x3b,
0x79, 0xb7, 0x97, 0x85, 0x10, 0xb5, 0xba, 0x3c, 0xb6, 0x70, 0xd0, 0x6, 0xa1, 0xfa, 0x81, 0x82,
0x83, 0x7e, 0x7f, 0x80, 0x96, 0x73, 0xbe, 0x56, 0x9b, 0x9e, 0x95, 0xd9, 0xf7, 0x2, 0xb9, 0xa4,
0xde, 0x6a, 0x32, 0x6d, 0xd8, 0x8a, 0x84, 0x72, 0x2a, 0x14, 0x9f, 0x88, 0xf9, 0xdc, 0x89, 0x9a,
0xfb, 0x7c, 0x2e, 0xc3, 0x8f, 0xb8, 0x65, 0x48, 0x26, 0xc8, 0x12, 0x4a, 0xce, 0xe7, 0xd2, 0x62,
0xc, 0xe0, 0x1f, 0xef, 0x11, 0x75, 0x78, 0x71, 0xa5, 0x8e, 0x76, 0x3d, 0xbd, 0xbc, 0x86, 0x57,
0xb, 0x28, 0x2f, 0xa3, 0xda, 0xd4, 0xe4, 0xf, 0xa9, 0x27, 0x53, 0x4, 0x1b, 0xfc, 0xac, 0xe6,
0x7a, 0x7, 0xae, 0x63, 0xc5, 0xdb, 0xe2, 0xea, 0x94, 0x8b, 0xc4, 0xd5, 0x9d, 0xf8, 0x90, 0x6b,
0xb1, 0xd, 0xd6, 0xeb, 0xc6, 0xe, 0xcf, 0xad, 0x8, 0x4e, 0xd7, 0xe3, 0x5d, 0x50, 0x1e, 0xb3,
0x5b, 0x23, 0x38, 0x34, 0x68, 0x46, 0x3, 0x8c, 0xdd, 0x9c, 0x7d, 0xa0, 0xcd, 0x1a, 0x41, 0x1c};
int reordering_24[14][24] = {
{7, 4, 14, 22, 0, 11, 18, 9, 6, 20, 1, 21, 10, 15, 3, 8, 2, 16, 5, 19, 12, 13, 17, 23},
{1, 19, 7, 10, 16, 21, 15, 2, 5, 13, 18, 12, 23, 8, 17, 4, 9, 22, 0, 3, 11, 6, 14, 20},
{22, 17, 2, 14, 7, 10, 9, 20, 6, 3, 16, 21, 11, 15, 0, 18, 4, 12, 5, 1, 8, 13, 23, 19},
{7, 16, 12, 1, 2, 13, 20, 23, 14, 19, 21, 6, 9, 4, 0, 11, 5, 3, 17, 18, 15, 22, 10, 8},
{0},
{0},
{0},
{0},
{23, 15, 18, 5, 8, 0, 3, 12, 10, 19, 21, 7, 16, 9, 13, 4, 20, 11, 6, 1, 17, 2, 22, 14},
{12, 3, 19, 16, 22, 13, 1, 5, 4, 8, 7, 21, 17, 11, 15, 18, 14, 23, 10, 6, 2, 20, 0, 9},
{4, 10, 16, 14, 1, 18, 8, 0, 15, 7, 12, 5, 20, 21, 2, 13, 17, 22, 6, 19, 9, 11, 3, 23},
{18, 0, 7, 19, 15, 8, 21, 2, 13, 16, 3, 20, 11, 9, 22, 6, 4, 14, 10, 1, 23, 5, 17, 12},
{14, 19, 2, 9, 16, 18, 8, 4, 20, 6, 5, 12, 17, 21, 3, 13, 10, 1, 15, 23, 7, 11, 0, 22},
{14, 3, 4, 17, 13, 16, 11, 0, 23, 12, 22, 15, 2, 5, 8, 20, 1, 18, 19, 9, 6, 10, 21, 7}
};
int rev_reordering_24[14][24] = {
{4, 10, 16, 14, 1, 18, 8, 0, 15, 7, 12, 5, 20, 21, 2, 13, 17, 22, 6, 19, 9, 11, 3, 23},
{18, 0, 7, 19, 15, 8, 21, 2, 13, 16, 3, 20, 11, 9, 22, 6, 4, 14, 10, 1, 23, 5, 17, 12},
{14, 19, 2, 9, 16, 18, 8, 4, 20, 6, 5, 12, 17, 21, 3, 13, 10, 1, 15, 23, 7, 11, 0, 22},
{14, 3, 4, 17, 13, 16, 11, 0, 23, 12, 22, 15, 2, 5, 8, 20, 1, 18, 19, 9, 6, 10, 21, 7},
{0},
{0},
{0},
{0},
{5, 19, 21, 6, 15, 3, 18, 11, 4, 13, 8, 17, 7, 14, 23, 1, 12, 20, 2, 9, 16, 10, 22, 0},
{22, 6, 20, 1, 8, 7, 19, 10, 9, 23, 18, 13, 0, 5, 16, 14, 3, 12, 15, 2, 21, 11, 4, 17},
{7, 4, 14, 22, 0, 11, 18, 9, 6, 20, 1, 21, 10, 15, 3, 8, 2, 16, 5, 19, 12, 13, 17, 23},
{1, 19, 7, 10, 16, 21, 15, 2, 5, 13, 18, 12, 23, 8, 17, 4, 9, 22, 0, 3, 11, 6, 14, 20},
{22, 17, 2, 14, 7, 10, 9, 20, 6, 3, 16, 21, 11, 15, 0, 18, 4, 12, 5, 1, 8, 13, 23, 19},
{7, 16, 12, 1, 2, 13, 20, 23, 14, 19, 21, 6, 9, 4, 0, 11, 5, 3, 17, 18, 15, 22, 10, 8}
};
int reordering_128[14][128] = {
{79, 121, 89, 83, 99, 31, 64, 21, 40, 62, 7, 33, 9, 114, 111, 54, 4, 68, 73, 90, 103, 110, 37, 115, 41, 52, 84, 124, 8, 16, 28, 63, 10, 96, 93, 32, 50, 2, 43, 109, 86, 125, 60, 119, 29, 66, 74, 18, 53, 20, 97, 42, 81, 12, 1, 106, 30, 70, 35, 59, 118, 78, 120, 95, 108, 6, 47, 58, 116, 23, 11, 82, 127, 65, 26, 36, 48, 91, 72, 100, 46, 104, 56, 80, 0, 27, 76, 51, 67, 22, 117, 38, 126, 92, 98, 13, 17, 101, 88, 123, 57, 45, 15, 75, 107, 5, 69, 49, 113, 39, 85, 25, 3, 122, 44, 77, 55, 105, 24, 112, 61, 14, 87, 102, 34, 19, 71, 94},
{73, 33, 14, 45, 95, 83, 1, 110, 52, 124, 16, 99, 115, 27, 64, 56, 2, 71, 92, 126, 39, 101, 12, 53, 109, 116, 77, 41, 26, 22, 59, 82, 63, 36, 105, 18, 121, 86, 11, 118, 46, 75, 66, 5, 89, 54, 103, 29, 125, 3, 47, 81, 76, 15, 51, 102, 114, 28, 88, 108, 21, 57, 67, 38, 20, 34, 84, 106, 113, 42, 91, 120, 98, 78, 55, 62, 7, 68, 8, 24, 79, 65, 10, 31, 60, 122, 6, 49, 43, 32, 96, 85, 90, 23, 107, 119, 100, 40, 72, 112, 58, 4, 123, 93, 13, 111, 50, 19, 37, 70, 25, 80, 44, 74, 17, 117, 87, 30, 94, 9, 69, 35, 48, 0, 61, 127, 97, 104},
{106, 116, 18, 98, 70, 7, 95, 125, 50, 9, 85, 59, 26, 45, 78, 34, 111, 83, 94, 39, 4, 127, 48, 68, 75, 96, 28, 56, 20, 114, 8, 42, 122, 101, 47, 63, 115, 6, 77, 29, 36, 17, 107, 87, 51, 11, 65, 93, 104, 55, 124, 37, 46, 119, 91, 103, 13, 64, 79, 16, 30, 82, 61, 0, 120, 84, 71, 23, 27, 118, 88, 57, 32, 15, 108, 52, 102, 40, 1, 72, 19, 66, 92, 24, 117, 60, 10, 105, 123, 5, 49, 81, 33, 76, 41, 100, 109, 89, 31, 112, 69, 97, 126, 43, 54, 14, 74, 86, 2, 58, 21, 35, 73, 62, 12, 113, 3, 121, 110, 44, 99, 38, 67, 90, 80, 22, 25, 53},
{25, 65, 83, 115, 76, 48, 10, 3, 47, 18, 110, 126, 98, 56, 90, 38, 99, 24, 40, 72, 6, 84, 89, 69, 20, 54, 59, 33, 112, 12, 106, 120, 34, 15, 46, 2, 16, 70, 101, 82, 61, 50, 118, 88, 79, 121, 104, 29, 0, 62, 22, 114, 26, 75, 8, 123, 44, 107, 52, 71, 93, 100, 37, 86, 103, 51, 109, 39, 11, 57, 119, 64, 95, 30, 42, 19, 73, 125, 1, 81, 9, 49, 87, 23, 91, 45, 7, 97, 68, 32, 28, 124, 63, 108, 78, 117, 27, 80, 17, 77, 122, 41, 14, 5, 35, 113, 67, 55, 102, 92, 105, 60, 36, 74, 96, 127, 43, 94, 4, 85, 21, 13, 111, 31, 66, 116, 58, 53},
{20, 92, 2, 104, 59, 67, 8, 100, 37, 85, 49, 113, 77, 121, 44, 28, 110, 6, 10, 71, 56, 93, 118, 32, 55, 16, 29, 82, 43, 98, 76, 126, 124, 66, 99, 83, 17, 25, 88, 48, 39, 3, 12, 60, 47, 75, 112, 111, 87, 90, 4, 33, 13, 46, 68, 24, 54, 105, 18, 123, 117, 103, 78, 57, 122, 26, 53, 19, 64, 34, 116, 89, 81, 62, 107, 79, 102, 45, 14, 5, 15, 114, 36, 61, 72, 95, 86, 109, 7, 65, 120, 96, 41, 31, 23, 52, 80, 11, 101, 70, 21, 106, 119, 42, 73, 0, 35, 51, 58, 91, 30, 127, 74, 94, 1, 125, 97, 38, 27, 63, 9, 115, 50, 84, 108, 22, 40, 69},
{28, 34, 78, 58, 106, 118, 86, 100, 95, 46, 6, 65, 11, 19, 127, 50, 107, 89, 122, 16, 25, 51, 81, 32, 42, 97, 8, 69, 116, 72, 1, 62, 48, 68, 111, 87, 119, 39, 20, 124, 102, 59, 91, 44, 24, 15, 5, 77, 103, 12, 75, 33, 83, 105, 21, 43, 90, 52, 27, 117, 7, 66, 63, 126, 55, 112, 64, 120, 56, 110, 47, 101, 10, 35, 4, 26, 18, 85, 76, 94, 22, 61, 41, 3, 73, 30, 98, 125, 93, 84, 113, 13, 70, 53, 104, 36, 80, 115, 92, 17, 79, 54, 123, 31, 37, 9, 40, 57, 2, 96, 71, 109, 74, 38, 67, 121, 60, 99, 14, 88, 29, 108, 82, 49, 0, 114, 23, 45},
{64, 85, 78, 43, 37, 118, 122, 107, 12, 30, 100, 1, 18, 51, 94, 63, 3, 10, 23, 95, 62, 81, 40, 50, 36, 99, 66, 79, 105, 119, 27, 125, 90, 117, 38, 14, 5, 57, 55, 87, 73, 111, 20, 123, 25, 103, 44, 69, 17, 32, 126, 97, 28, 13, 106, 114, 58, 42, 88, 54, 80, 6, 75, 71, 101, 0, 39, 124, 41, 29, 84, 8, 70, 76, 109, 48, 113, 59, 92, 22, 31, 112, 108, 53, 33, 47, 82, 65, 4, 60, 16, 91, 98, 121, 11, 77, 15, 115, 24, 67, 74, 2, 86, 52, 93, 19, 127, 110, 35, 56, 102, 46, 72, 26, 61, 21, 7, 96, 45, 9, 49, 34, 120, 116, 104, 83, 89, 68},
{94, 84, 8, 115, 61, 48, 0, 106, 29, 23, 127, 71, 98, 44, 75, 37, 19, 3, 25, 66, 99, 125, 40, 112, 52, 107, 15, 88, 33, 80, 57, 78, 51, 83, 104, 58, 123, 38, 103, 93, 67, 6, 30, 43, 20, 13, 113, 73, 74, 124, 105, 101, 85, 70, 34, 92, 1, 11, 116, 56, 31, 42, 22, 55, 4, 47, 54, 86, 90, 114, 17, 12, 72, 122, 26, 100, 59, 32, 68, 108, 2, 41, 62, 69, 110, 121, 16, 81, 14, 27, 102, 77, 118, 39, 50, 91, 87, 36, 5, 89, 96, 49, 60, 45, 28, 9, 18, 120, 64, 109, 117, 79, 21, 119, 111, 46, 63, 53, 82, 126, 76, 35, 97, 7, 24, 10, 95, 65},
{63, 69, 122, 29, 40, 96, 117, 89, 54, 6, 87, 13, 21, 73, 106, 34, 119, 36, 30, 91, 52, 107, 67, 76, 124, 16, 84, 14, 44, 100, 2, 58, 26, 56, 0, 126, 83, 105, 112, 70, 55, 23, 47, 93, 75, 102, 15, 39, 98, 113, 1, 85, 71, 50, 45, 78, 111, 61, 120, 95, 32, 8, 18, 24, 90, 77, 33, 49, 114, 66, 80, 103, 20, 62, 3, 31, 11, 121, 41, 110, 127, 101, 17, 51, 42, 9, 86, 64, 104, 5, 60, 92, 35, 118, 28, 72, 65, 53, 79, 97, 88, 12, 7, 109, 25, 37, 115, 22, 57, 125, 46, 82, 74, 123, 99, 38, 94, 27, 48, 116, 68, 81, 4, 10, 59, 108, 19, 43},
{27, 108, 119, 45, 72, 21, 4, 87, 58, 15, 127, 97, 92, 54, 35, 67, 107, 125, 24, 39, 98, 90, 47, 7, 73, 83, 68, 16, 53, 63, 118, 10, 106, 66, 20, 86, 8, 116, 51, 6, 100, 25, 94, 78, 60, 124, 42, 34, 102, 74, 59, 52, 5, 115, 43, 29, 65, 12, 88, 37, 122, 85, 22, 105, 80, 19, 89, 9, 123, 61, 70, 99, 109, 77, 26, 49, 2, 33, 117, 41, 103, 30, 55, 79, 17, 14, 56, 36, 104, 112, 126, 81, 46, 71, 3, 93, 31, 69, 91, 62, 76, 40, 114, 48, 110, 82, 13, 120, 1, 38, 101, 23, 84, 28, 0, 113, 32, 96, 75, 57, 64, 50, 18, 11, 121, 95, 111, 44},
{84, 54, 37, 112, 16, 105, 65, 10, 28, 12, 32, 70, 53, 95, 121, 102, 29, 96, 47, 125, 49, 7, 89, 69, 118, 111, 74, 85, 30, 44, 56, 5, 35, 11, 124, 58, 75, 22, 91, 109, 8, 24, 51, 38, 114, 101, 80, 66, 76, 107, 36, 87, 25, 48, 15, 116, 82, 100, 67, 59, 42, 120, 9, 31, 6, 73, 45, 88, 17, 106, 57, 126, 78, 18, 46, 103, 86, 115, 61, 0, 83, 52, 71, 3, 26, 110, 40, 122, 98, 2, 19, 77, 93, 34, 127, 63, 33, 50, 94, 4, 79, 97, 123, 20, 81, 117, 55, 104, 64, 39, 21, 14, 119, 108, 13, 23, 68, 90, 60, 43, 62, 1, 113, 99, 27, 41, 92, 72},
{123, 6, 16, 49, 101, 43, 86, 76, 78, 119, 82, 38, 22, 104, 2, 53, 10, 114, 35, 107, 64, 60, 29, 93, 79, 110, 28, 13, 57, 47, 117, 83, 89, 1, 65, 121, 33, 108, 63, 20, 97, 27, 69, 88, 112, 3, 40, 50, 122, 87, 106, 54, 8, 23, 45, 74, 15, 61, 100, 30, 84, 124, 75, 32, 14, 81, 42, 62, 77, 120, 109, 17, 98, 0, 113, 41, 52, 26, 73, 80, 111, 51, 31, 5, 66, 91, 37, 116, 58, 44, 92, 70, 18, 103, 118, 4, 90, 126, 72, 11, 96, 21, 55, 46, 127, 34, 67, 94, 59, 24, 7, 105, 99, 68, 56, 12, 25, 115, 39, 95, 71, 36, 85, 102, 9, 48, 19, 125},
{63, 78, 108, 116, 20, 89, 37, 5, 30, 9, 86, 45, 114, 56, 105, 73, 59, 41, 2, 80, 28, 110, 125, 67, 83, 126, 12, 68, 26, 39, 60, 98, 72, 92, 15, 111, 40, 51, 121, 19, 77, 94, 31, 103, 119, 13, 52, 34, 22, 90, 8, 44, 75, 127, 104, 49, 27, 71, 109, 11, 85, 62, 113, 35, 57, 46, 81, 122, 23, 100, 4, 66, 79, 112, 106, 24, 93, 38, 14, 58, 124, 91, 61, 17, 65, 10, 107, 43, 70, 97, 123, 54, 82, 47, 18, 6, 25, 101, 3, 120, 95, 33, 76, 55, 48, 87, 0, 42, 74, 96, 118, 16, 99, 115, 29, 36, 1, 84, 69, 53, 64, 117, 32, 88, 50, 7, 102, 21},
{48, 78, 35, 7, 118, 103, 20, 86, 54, 80, 6, 68, 29, 121, 102, 33, 36, 98, 9, 75, 24, 120, 50, 83, 17, 0, 52, 96, 90, 47, 73, 123, 89, 27, 32, 104, 112, 62, 15, 67, 18, 101, 74, 116, 56, 85, 34, 8, 5, 81, 41, 65, 58, 127, 25, 107, 13, 69, 126, 26, 111, 40, 49, 92, 71, 1, 124, 106, 88, 23, 37, 59, 19, 76, 113, 53, 4, 99, 94, 44, 97, 79, 39, 2, 21, 119, 63, 82, 43, 22, 14, 84, 109, 60, 117, 72, 114, 87, 12, 16, 61, 38, 108, 64, 46, 110, 30, 57, 93, 66, 10, 122, 28, 105, 51, 3, 125, 95, 42, 70, 31, 45, 100, 55, 91, 77, 11, 115}
};
int rev_reordering_128[14][128] = {
{84, 54, 37, 112, 16, 105, 65, 10, 28, 12, 32, 70, 53, 95, 121, 102, 29, 96, 47, 125, 49, 7, 89, 69, 118, 111, 74, 85, 30, 44, 56, 5, 35, 11, 124, 58, 75, 22, 91, 109, 8, 24, 51, 38, 114, 101, 80, 66, 76, 107, 36, 87, 25, 48, 15, 116, 82, 100, 67, 59, 42, 120, 9, 31, 6, 73, 45, 88, 17, 106, 57, 126, 78, 18, 46, 103, 86, 115, 61, 0, 83, 52, 71, 3, 26, 110, 40, 122, 98, 2, 19, 77, 93, 34, 127, 63, 33, 50, 94, 4, 79, 97, 123, 20, 81, 117, 55, 104, 64, 39, 21, 14, 119, 108, 13, 23, 68, 90, 60, 43, 62, 1, 113, 99, 27, 41, 92, 72},
{123, 6, 16, 49, 101, 43, 86, 76, 78, 119, 82, 38, 22, 104, 2, 53, 10, 114, 35, 107, 64, 60, 29, 93, 79, 110, 28, 13, 57, 47, 117, 83, 89, 1, 65, 121, 33, 108, 63, 20, 97, 27, 69, 88, 112, 3, 40, 50, 122, 87, 106, 54, 8, 23, 45, 74, 15, 61, 100, 30, 84, 124, 75, 32, 14, 81, 42, 62, 77, 120, 109, 17, 98, 0, 113, 41, 52, 26, 73, 80, 111, 51, 31, 5, 66, 91, 37, 116, 58, 44, 92, 70, 18, 103, 118, 4, 90, 126, 72, 11, 96, 21, 55, 46, 127, 34, 67, 94, 59, 24, 7, 105, 99, 68, 56, 12, 25, 115, 39, 95, 71, 36, 85, 102, 9, 48, 19, 125},
{63, 78, 108, 116, 20, 89, 37, 5, 30, 9, 86, 45, 114, 56, 105, 73, 59, 41, 2, 80, 28, 110, 125, 67, 83, 126, 12, 68, 26, 39, 60, 98, 72, 92, 15, 111, 40, 51, 121, 19, 77, 94, 31, 103, 119, 13, 52, 34, 22, 90, 8, 44, 75, 127, 104, 49, 27, 71, 109, 11, 85, 62, 113, 35, 57, 46, 81, 122, 23, 100, 4, 66, 79, 112, 106, 24, 93, 38, 14, 58, 124, 91, 61, 17, 65, 10, 107, 43, 70, 97, 123, 54, 82, 47, 18, 6, 25, 101, 3, 120, 95, 33, 76, 55, 48, 87, 0, 42, 74, 96, 118, 16, 99, 115, 29, 36, 1, 84, 69, 53, 64, 117, 32, 88, 50, 7, 102, 21},
{48, 78, 35, 7, 118, 103, 20, 86, 54, 80, 6, 68, 29, 121, 102, 33, 36, 98, 9, 75, 24, 120, 50, 83, 17, 0, 52, 96, 90, 47, 73, 123, 89, 27, 32, 104, 112, 62, 15, 67, 18, 101, 74, 116, 56, 85, 34, 8, 5, 81, 41, 65, 58, 127, 25, 107, 13, 69, 126, 26, 111, 40, 49, 92, 71, 1, 124, 106, 88, 23, 37, 59, 19, 76, 113, 53, 4, 99, 94, 44, 97, 79, 39, 2, 21, 119, 63, 82, 43, 22, 14, 84, 109, 60, 117, 72, 114, 87, 12, 16, 61, 38, 108, 64, 46, 110, 30, 57, 93, 66, 10, 122, 28, 105, 51, 3, 125, 95, 42, 70, 31, 45, 100, 55, 91, 77, 11, 115},
{105, 114, 2, 41, 50, 79, 17, 88, 6, 120, 18, 97, 42, 52, 78, 80, 25, 36, 58, 67, 0, 100, 125, 94, 55, 37, 65, 118, 15, 26, 110, 93, 23, 51, 69, 106, 82, 8, 117, 40, 126, 92, 103, 28, 14, 77, 53, 44, 39, 10, 122, 107, 95, 66, 56, 24, 20, 63, 108, 4, 43, 83, 73, 119, 68, 89, 33, 5, 54, 127, 99, 19, 84, 104, 112, 45, 30, 12, 62, 75, 96, 72, 27, 35, 123, 9, 86, 48, 38, 71, 49, 109, 1, 21, 113, 85, 91, 116, 29, 34, 7, 98, 76, 61, 3, 57, 101, 74, 124, 87, 16, 47, 46, 11, 81, 121, 70, 60, 22, 102, 90, 13, 64, 59, 32, 115, 31, 111},
{124, 30, 108, 83, 74, 46, 10, 60, 26, 105, 72, 12, 49, 91, 118, 45, 19, 99, 76, 13, 38, 54, 80, 126, 44, 20, 75, 58, 0, 120, 85, 103, 23, 51, 1, 73, 95, 104, 113, 37, 106, 82, 24, 55, 43, 127, 9, 70, 32, 123, 15, 21, 57, 93, 101, 64, 68, 107, 3, 41, 116, 81, 31, 62, 66, 11, 61, 114, 33, 27, 92, 110, 29, 84, 112, 50, 78, 47, 2, 100, 96, 22, 122, 52, 89, 77, 6, 35, 119, 17, 56, 42, 98, 88, 79, 8, 109, 25, 86, 117, 7, 71, 40, 48, 94, 53, 4, 16, 121, 111, 69, 34, 65, 90, 125, 97, 28, 59, 5, 36, 67, 115, 18, 102, 39, 87, 63, 14},
{65, 11, 101, 16, 88, 36, 61, 116, 71, 119, 17, 94, 8, 53, 35, 96, 90, 48, 12, 105, 42, 115, 79, 18, 98, 44, 113, 30, 52, 69, 9, 80, 49, 84, 121, 108, 24, 4, 34, 66, 22, 68, 57, 3, 46, 118, 111, 85, 75, 120, 23, 13, 103, 83, 59, 38, 109, 37, 56, 77, 89, 114, 20, 15, 0, 87, 26, 99, 127, 47, 72, 63, 112, 40, 100, 62, 73, 95, 2, 27, 60, 21, 86, 125, 70, 1, 102, 39, 58, 126, 32, 91, 78, 104, 14, 19, 117, 51, 92, 25, 10, 64, 110, 45, 124, 28, 54, 7, 82, 74, 107, 41, 81, 76, 55, 97, 123, 33, 5, 29, 122, 93, 6, 43, 67, 31, 50, 106},
{6, 56, 80, 17, 64, 98, 41, 123, 2, 105, 125, 57, 71, 45, 88, 26, 86, 70, 106, 16, 44, 112, 62, 9, 124, 18, 74, 89, 104, 8, 42, 60, 77, 28, 54, 121, 97, 15, 37, 93, 22, 81, 61, 43, 13, 103, 115, 65, 5, 101, 94, 32, 24, 117, 66, 63, 59, 30, 35, 76, 102, 4, 82, 116, 108, 127, 19, 40, 78, 83, 53, 11, 72, 47, 48, 14, 120, 91, 31, 111, 29, 87, 118, 33, 1, 52, 67, 96, 27, 99, 68, 95, 55, 39, 0, 126, 100, 122, 12, 20, 75, 51, 90, 38, 34, 50, 7, 25, 79, 109, 84, 114, 23, 46, 69, 3, 58, 110, 92, 113, 107, 85, 73, 36, 49, 21, 119, 10},
{34, 50, 30, 74, 122, 89, 9, 102, 61, 85, 123, 76, 101, 11, 27, 46, 25, 82, 62, 126, 72, 12, 107, 41, 63, 104, 32, 117, 94, 3, 18, 75, 60, 66, 15, 92, 17, 105, 115, 47, 4, 78, 84, 127, 28, 54, 110, 42, 118, 67, 53, 83, 20, 97, 8, 40, 33, 108, 31, 124, 90, 57, 73, 0, 87, 96, 69, 22, 120, 1, 39, 52, 95, 13, 112, 44, 23, 65, 55, 98, 70, 121, 111, 36, 26, 51, 86, 10, 100, 7, 64, 19, 91, 43, 116, 59, 5, 99, 48, 114, 29, 81, 45, 71, 88, 37, 14, 21, 125, 103, 79, 56, 38, 49, 68, 106, 119, 6, 93, 16, 58, 77, 2, 113, 24, 109, 35, 80},
{114, 108, 76, 94, 6, 52, 39, 23, 36, 67, 31, 123, 57, 106, 85, 9, 27, 84, 122, 65, 34, 5, 62, 111, 18, 41, 74, 0, 113, 55, 81, 96, 116, 77, 47, 14, 87, 59, 109, 19, 101, 79, 46, 54, 127, 3, 92, 22, 103, 75, 121, 38, 51, 28, 13, 82, 86, 119, 8, 50, 44, 69, 99, 29, 120, 56, 33, 15, 26, 97, 70, 93, 4, 24, 49, 118, 100, 73, 43, 83, 64, 91, 105, 25, 112, 61, 35, 7, 58, 66, 21, 98, 12, 95, 42, 125, 117, 11, 20, 71, 40, 110, 48, 80, 88, 63, 32, 16, 1, 72, 104, 126, 89, 115, 102, 53, 37, 78, 30, 2, 107, 124, 60, 68, 45, 17, 90, 10},
{79, 121, 89, 83, 99, 31, 64, 21, 40, 62, 7, 33, 9, 114, 111, 54, 4, 68, 73, 90, 103, 110, 37, 115, 41, 52, 84, 124, 8, 16, 28, 63, 10, 96, 93, 32, 50, 2, 43, 109, 86, 125, 60, 119, 29, 66, 74, 18, 53, 20, 97, 42, 81, 12, 1, 106, 30, 70, 35, 59, 118, 78, 120, 95, 108, 6, 47, 58, 116, 23, 11, 82, 127, 65, 26, 36, 48, 91, 72, 100, 46, 104, 56, 80, 0, 27, 76, 51, 67, 22, 117, 38, 126, 92, 98, 13, 17, 101, 88, 123, 57, 45, 15, 75, 107, 5, 69, 49, 113, 39, 85, 25, 3, 122, 44, 77, 55, 105, 24, 112, 61, 14, 87, 102, 34, 19, 71, 94},
{73, 33, 14, 45, 95, 83, 1, 110, 52, 124, 16, 99, 115, 27, 64, 56, 2, 71, 92, 126, 39, 101, 12, 53, 109, 116, 77, 41, 26, 22, 59, 82, 63, 36, 105, 18, 121, 86, 11, 118, 46, 75, 66, 5, 89, 54, 103, 29, 125, 3, 47, 81, 76, 15, 51, 102, 114, 28, 88, 108, 21, 57, 67, 38, 20, 34, 84, 106, 113, 42, 91, 120, 98, 78, 55, 62, 7, 68, 8, 24, 79, 65, 10, 31, 60, 122, 6, 49, 43, 32, 96, 85, 90, 23, 107, 119, 100, 40, 72, 112, 58, 4, 123, 93, 13, 111, 50, 19, 37, 70, 25, 80, 44, 74, 17, 117, 87, 30, 94, 9, 69, 35, 48, 0, 61, 127, 97, 104},
{106, 116, 18, 98, 70, 7, 95, 125, 50, 9, 85, 59, 26, 45, 78, 34, 111, 83, 94, 39, 4, 127, 48, 68, 75, 96, 28, 56, 20, 114, 8, 42, 122, 101, 47, 63, 115, 6, 77, 29, 36, 17, 107, 87, 51, 11, 65, 93, 104, 55, 124, 37, 46, 119, 91, 103, 13, 64, 79, 16, 30, 82, 61, 0, 120, 84, 71, 23, 27, 118, 88, 57, 32, 15, 108, 52, 102, 40, 1, 72, 19, 66, 92, 24, 117, 60, 10, 105, 123, 5, 49, 81, 33, 76, 41, 100, 109, 89, 31, 112, 69, 97, 126, 43, 54, 14, 74, 86, 2, 58, 21, 35, 73, 62, 12, 113, 3, 121, 110, 44, 99, 38, 67, 90, 80, 22, 25, 53},
{25, 65, 83, 115, 76, 48, 10, 3, 47, 18, 110, 126, 98, 56, 90, 38, 99, 24, 40, 72, 6, 84, 89, 69, 20, 54, 59, 33, 112, 12, 106, 120, 34, 15, 46, 2, 16, 70, 101, 82, 61, 50, 118, 88, 79, 121, 104, 29, 0, 62, 22, 114, 26, 75, 8, 123, 44, 107, 52, 71, 93, 100, 37, 86, 103, 51, 109, 39, 11, 57, 119, 64, 95, 30, 42, 19, 73, 125, 1, 81, 9, 49, 87, 23, 91, 45, 7, 97, 68, 32, 28, 124, 63, 108, 78, 117, 27, 80, 17, 77, 122, 41, 14, 5, 35, 113, 67, 55, 102, 92, 105, 60, 36, 74, 96, 127, 43, 94, 4, 85, 21, 13, 111, 31, 66, 116, 58, 53}
};
void init(bitset<K>);
bitset<N> BitReordering(bitset<N>, int); // input, index
bitset<N> BitReorderingRev(bitset<N>, int); // input, index
bitset<N> SBox(bitset<N>, bitset<N>[], int); //input, rand, index
bitset<N> Inv_SBox(bitset<N>, bitset<N>[], int); //input, rand, index
bitset<N> EncCPA(bitset<N>, bitset<K>, bitset<N>[]); //input, key, rand
bitset<N> DecCPA(bitset<N>, bitset<K>, bitset<N>[]); //input, key, rand
void KeyExpansion(bitset<K>, bitset<N>[]); // master secret key, k[0], k[1], k[2]
void KeyRecover(bitset<N>, bitset<N>[]);
};
#endif //K_CIPHER_KCIPHER_H