-
Notifications
You must be signed in to change notification settings - Fork 0
/
functions.h
138 lines (108 loc) · 3.26 KB
/
functions.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
#pragma once
#include "midori.h"
#define reg_num 4
#define default_gamma_size_Kb 1024
#define gamma_size (gamma_size_Kb*8192) //Èç Êá â áèòû
//Âûðàáîòêà 'ñëó÷àéíîãî' ÷èñëà óñèëåíèåì âñòðîåííîãî ãåíåðàòîðà C++
unsigned __int16 get_rand()
{
srand(time(0));
unsigned int tmp = rand(), res = 0;
for (int i = 0; i < 16; ++i)
{
res |= (tmp & 1) << i;
tmp = rand();
}
return res;
}
unsigned __int16 get_key(char* fKey)
{
ifstream in(fKey);
char* strKey = new char[6];
strKey[0] = '0';
strKey[1] = 'x';
for (int i = 2; i < 6; i++)
in.get(strKey[i]);
in.close();
return strtoul(strKey, NULL, 0);;
}
//Ôóíêöèÿ âû÷èñëåíèÿ ÷åòíîñòè âåêòîðà
unsigned __int16 get_parity(unsigned __int16 x)
{
x ^= (x >> 8);
x ^= (x >> 4);
x ^= (x >> 2);
x ^= (x >> 1);
return (x & 1);
}
//Ôóíêöèÿ ñäâèãà ðåãèñòðà
void reg_shift(unsigned __int16 ®s, unsigned __int16 fb_polynoms, unsigned __int16 reg_masks)
{
regs = ((regs << 1) | (get_parity(regs & fb_polynoms))) & reg_masks;
return;
}
//Ôóíêöèÿ èíèöèàëèçàöèè ðåãèñòðîâ
void gen_init(unsigned __int16 *regs, unsigned __int16 *reg_masks, unsigned __int16 key)
{
unsigned int init_key = 0xfed4e850;
regs[0] = (Midori16(3, init_key, key)) & reg_masks[0];
for (unsigned int i = 2; i < reg_num; ++i)
regs[i] = (Midori16(3, init_key, (key * regs[i-1]) & 0xffff )) & reg_masks[i];
return;
}
//Ôóíêöèÿ ïîëó÷åíèÿ áèòà ãàììû
unsigned int gen_shift(unsigned __int16 *regs, unsigned __int16 *fb_polynoms, unsigned __int16 *reg_masks)
{
unsigned __int16 i, gamma_bit, arg, vote;
//Íåëèíåéíàÿ ñîñòàâëÿþùàÿ
for (i = 0; i < reg_num; ++i)
arg |= ((regs[i] & 1) << i);
gamma_bit = (0xeca0 >> arg) & 1; //0xeca0 - áåíò-ôóíêöèÿ îò 4 ïåðåìåííûõ; 7 åäèíèö 9 íóëåé
//Ëèíåéíàÿ ñîñòàâëÿþùàÿ
for (i = 0; i < reg_num; ++i)
gamma_bit ^= (regs[i] >> ((3 * i) & 0x3ff)) & 1;
//Ñäâèã
for (i = 0; i < reg_num; ++i)
{
//1 ýòàï
arg = ((regs[(i + 1) % reg_num] >> 1) & 1) |
(((regs[(i + 2) % reg_num] >> 2) & 1) << 1) |
(((regs[(i + 3) % reg_num] >> 3) & 1) << 2);
vote = (0xe8 >> arg) & 1;
for (unsigned int k = 0; k < vote + 1; ++k)
reg_shift(regs[i], fb_polynoms[i], reg_masks[i]);
//2 ýòàï
arg = ((regs[(i + 4) % reg_num] >> 4) & 1) |
(((regs[(i + 3) % reg_num] >> 3) & 1) << 1) |
(((regs[(i + 2) % reg_num] >> 2) & 1) << 2);
vote = (0xe8 >> arg) & 1;
regs[i] ^= vote ^ ((regs[(i + 1) % reg_num] >> 7) & 1);
}
return gamma_bit;
}
void getGamma(unsigned __int16 *regs, unsigned __int16 *fb_polynoms, unsigned __int16 *reg_masks, unsigned __int16 key, char* fOut, unsigned __int64 gamma_size_Kb)
{
//Èíèöèàëèçàöèÿ ãåíåðàòîðà
gen_init(regs, reg_masks, key);
//Îòêðûòèå â ôàéëà â ðåæèìå ïðåäâàðèòåëüíîé î÷èñòêè
ofstream out;
out.open(fOut, ios_base::trunc);
//Âûðàáîòêà ãàììû è çàïèñü â ôàéë
for (unsigned __int64 i = 0; i < gamma_size; ++i)
out << (gen_shift(regs, fb_polynoms, reg_masks) & 1);
out.close();
cout << "Ñäåëàíî." << endl;
return;
}
/*
bool tmp;
unsigned __int64 count = 0;
for (unsigned __int64 i = 0; i < gamma_size; ++i)
{
tmp = (gen_shift(regs, fb_polynoms, reg_masks) & 1);
out << tmp;
if (tmp)
count++;
}
cout << (double)(count / (double)gamma_size) * 100 << endl;
*/