-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmd5.cpp
More file actions
157 lines (141 loc) · 2.8 KB
/
md5.cpp
File metadata and controls
157 lines (141 loc) · 2.8 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
#include "md5.hpp"
unsigned int g_a;
unsigned int g_b;
unsigned int g_c;
unsigned int g_d;
unsigned int g_k[64];
t_bt g_m[16][4];
static unsigned int g_coe[64] = {7, 12, 17, 22, 7, 12, 17, 22,
7, 12, 17, 22, 7, 12, 17, 22,
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 };
static unsigned int rotate(unsigned int nbr, int n)
{
int i;
unsigned int bit;
i = 0;
while (i < n)
{
bit = (nbr & 1) << 31;
nbr = nbr >> 1;
nbr += bit;
i++;
}
return (nbr);
}
static void reverse_bits(unsigned int *c)
{
unsigned int t;
t = 0;
t += *c & 0xff;
t = t << 8;
t += (*c >> 8) & 0xff;
t = t << 8;
t += (*c >> 16) & 0xff;
t = t << 8;
t += (*c >> 24) & 0xff;
*c = t;
}
static void do_step(int const i, t_v *vp)
{
if (0 <= i && i < 16)
{
vp->f = (vp->b & vp->c) | ((~vp->b) & vp->d);
vp->g = i;
}
else if (16 <= i && i < 32)
{
vp->f = (vp->d & vp->b) | ((~vp->d) & vp->c);
vp->g = (5 * i + 1) & 15;
}
else if (32 <= i && i < 48)
{
vp->f = vp->b ^ vp->c ^ vp->d;
vp->g = (3 * i + 5) & 15;
}
else
{
vp->f = vp->c ^ (vp->b | (~vp->d));
vp->g = 7 * i & 15;
}
vp->f += vp->a + g_k[i] + *((unsigned int*)(g_m[vp->g]));
vp->a = vp->d;
vp->d = vp->c;
vp->c = vp->b;
vp->b += (vp->f << g_coe[i]) | (vp->f >> (32 - g_coe[i]));
}
static void do_stage(int const count, t_v *vp)
{
int i;
int j;
vp->a = g_a;
vp->b = g_b;
vp->c = g_c;
vp->d = g_d;
i = -1;
while (++i < 16)
{
j = -1;
while (++j < 4)
g_m[i][j] = g_new[count * 64 + i * 4 + j];
}
i = -1;
while (++i < 64)
do_step(i, vp);
g_a += vp->a;
g_b += vp->b;
g_c += vp->c;
g_d += vp->d;
}
static void set_up(std::string const str)
{
int i;
t_bt bt;
g_len = str.size() << 3;
g_cks = (str.size() + 8) / 64 + 1;
g_new = (t_bt*)malloc(64 * g_cks);
i = -1;
while (++i < (int)(64 * g_cks))
g_new[i] = 0;
i = -1;
while (str[++i])
g_new[i] = str[i];
bt = 1 << 7;
g_new[str.size()] = bt;
i = -1;
while (++i < 8)
g_new[64 * g_cks - i - 1] = ((char*)(&g_len))[i];
}
void md5Init()
{
int i = -1;
while (++i < 64)
g_k[i] = floor(pow(2, 32) * fabs(sin(i + 1)));
}
const std::string md5_hash(std::string const str)
{
t_v v;
unsigned int count;
int i;
std::ostringstream s;
g_a = 0x67452301;
g_b = 0xefcdab89;
g_c = 0x98badcfe;
g_d = 0x10325476;
set_up(str);
count = -1;
while (++count < g_cks)
do_stage(count, &v);
reverse_bits(&g_a);
reverse_bits(&g_b);
reverse_bits(&g_c);
reverse_bits(&g_d);
s << std::hex << std::setfill('0') << std::setw(8) << g_a;
s << std::hex << std::setfill('0') << std::setw(8) << g_b;
s << std::hex << std::setfill('0') << std::setw(8) << g_c;
s << std::hex << std::setfill('0') << std::setw(8) << g_d;
if (g_new)
free(g_new);
return (s.str());
}