Skip to content

Commit e775aa5

Browse files
author
Josh Kramer
committedDec 5, 2016
Day 5
1 parent eb1012c commit e775aa5

File tree

3 files changed

+249
-0
lines changed

3 files changed

+249
-0
lines changed
 

‎2016/input/5.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cxdnnyjw

‎2016/md5.js

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
function md5cycle(x, k) {
2+
var a = x[0], b = x[1], c = x[2], d = x[3];
3+
4+
a = ff(a, b, c, d, k[0], 7, -680876936);
5+
d = ff(d, a, b, c, k[1], 12, -389564586);
6+
c = ff(c, d, a, b, k[2], 17, 606105819);
7+
b = ff(b, c, d, a, k[3], 22, -1044525330);
8+
a = ff(a, b, c, d, k[4], 7, -176418897);
9+
d = ff(d, a, b, c, k[5], 12, 1200080426);
10+
c = ff(c, d, a, b, k[6], 17, -1473231341);
11+
b = ff(b, c, d, a, k[7], 22, -45705983);
12+
a = ff(a, b, c, d, k[8], 7, 1770035416);
13+
d = ff(d, a, b, c, k[9], 12, -1958414417);
14+
c = ff(c, d, a, b, k[10], 17, -42063);
15+
b = ff(b, c, d, a, k[11], 22, -1990404162);
16+
a = ff(a, b, c, d, k[12], 7, 1804603682);
17+
d = ff(d, a, b, c, k[13], 12, -40341101);
18+
c = ff(c, d, a, b, k[14], 17, -1502002290);
19+
b = ff(b, c, d, a, k[15], 22, 1236535329);
20+
21+
a = gg(a, b, c, d, k[1], 5, -165796510);
22+
d = gg(d, a, b, c, k[6], 9, -1069501632);
23+
c = gg(c, d, a, b, k[11], 14, 643717713);
24+
b = gg(b, c, d, a, k[0], 20, -373897302);
25+
a = gg(a, b, c, d, k[5], 5, -701558691);
26+
d = gg(d, a, b, c, k[10], 9, 38016083);
27+
c = gg(c, d, a, b, k[15], 14, -660478335);
28+
b = gg(b, c, d, a, k[4], 20, -405537848);
29+
a = gg(a, b, c, d, k[9], 5, 568446438);
30+
d = gg(d, a, b, c, k[14], 9, -1019803690);
31+
c = gg(c, d, a, b, k[3], 14, -187363961);
32+
b = gg(b, c, d, a, k[8], 20, 1163531501);
33+
a = gg(a, b, c, d, k[13], 5, -1444681467);
34+
d = gg(d, a, b, c, k[2], 9, -51403784);
35+
c = gg(c, d, a, b, k[7], 14, 1735328473);
36+
b = gg(b, c, d, a, k[12], 20, -1926607734);
37+
38+
a = hh(a, b, c, d, k[5], 4, -378558);
39+
d = hh(d, a, b, c, k[8], 11, -2022574463);
40+
c = hh(c, d, a, b, k[11], 16, 1839030562);
41+
b = hh(b, c, d, a, k[14], 23, -35309556);
42+
a = hh(a, b, c, d, k[1], 4, -1530992060);
43+
d = hh(d, a, b, c, k[4], 11, 1272893353);
44+
c = hh(c, d, a, b, k[7], 16, -155497632);
45+
b = hh(b, c, d, a, k[10], 23, -1094730640);
46+
a = hh(a, b, c, d, k[13], 4, 681279174);
47+
d = hh(d, a, b, c, k[0], 11, -358537222);
48+
c = hh(c, d, a, b, k[3], 16, -722521979);
49+
b = hh(b, c, d, a, k[6], 23, 76029189);
50+
a = hh(a, b, c, d, k[9], 4, -640364487);
51+
d = hh(d, a, b, c, k[12], 11, -421815835);
52+
c = hh(c, d, a, b, k[15], 16, 530742520);
53+
b = hh(b, c, d, a, k[2], 23, -995338651);
54+
55+
a = ii(a, b, c, d, k[0], 6, -198630844);
56+
d = ii(d, a, b, c, k[7], 10, 1126891415);
57+
c = ii(c, d, a, b, k[14], 15, -1416354905);
58+
b = ii(b, c, d, a, k[5], 21, -57434055);
59+
a = ii(a, b, c, d, k[12], 6, 1700485571);
60+
d = ii(d, a, b, c, k[3], 10, -1894986606);
61+
c = ii(c, d, a, b, k[10], 15, -1051523);
62+
b = ii(b, c, d, a, k[1], 21, -2054922799);
63+
a = ii(a, b, c, d, k[8], 6, 1873313359);
64+
d = ii(d, a, b, c, k[15], 10, -30611744);
65+
c = ii(c, d, a, b, k[6], 15, -1560198380);
66+
b = ii(b, c, d, a, k[13], 21, 1309151649);
67+
a = ii(a, b, c, d, k[4], 6, -145523070);
68+
d = ii(d, a, b, c, k[11], 10, -1120210379);
69+
c = ii(c, d, a, b, k[2], 15, 718787259);
70+
b = ii(b, c, d, a, k[9], 21, -343485551);
71+
72+
x[0] = add32(a, x[0]);
73+
x[1] = add32(b, x[1]);
74+
x[2] = add32(c, x[2]);
75+
x[3] = add32(d, x[3]);
76+
77+
}
78+
79+
function cmn(q, a, b, x, s, t) {
80+
a = add32(add32(a, q), add32(x, t));
81+
return add32((a << s) | (a >>> (32 - s)), b);
82+
}
83+
84+
function ff(a, b, c, d, x, s, t) {
85+
return cmn((b & c) | ((~b) & d), a, b, x, s, t);
86+
}
87+
88+
function gg(a, b, c, d, x, s, t) {
89+
return cmn((b & d) | (c & (~d)), a, b, x, s, t);
90+
}
91+
92+
function hh(a, b, c, d, x, s, t) {
93+
return cmn(b ^ c ^ d, a, b, x, s, t);
94+
}
95+
96+
function ii(a, b, c, d, x, s, t) {
97+
return cmn(c ^ (b | (~d)), a, b, x, s, t);
98+
}
99+
100+
function md51(s) {
101+
txt = '';
102+
var n = s.length,
103+
state = [1732584193, -271733879, -1732584194, 271733878], i;
104+
for (i=64; i<=s.length; i+=64) {
105+
md5cycle(state, md5blk(s.substring(i-64, i)));
106+
}
107+
s = s.substring(i-64);
108+
var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0];
109+
for (i=0; i<s.length; i++)
110+
tail[i>>2] |= s.charCodeAt(i) << ((i%4) << 3);
111+
tail[i>>2] |= 0x80 << ((i%4) << 3);
112+
if (i > 55) {
113+
md5cycle(state, tail);
114+
for (i=0; i<16; i++) tail[i] = 0;
115+
}
116+
tail[14] = n*8;
117+
md5cycle(state, tail);
118+
return state;
119+
}
120+
121+
/* there needs to be support for Unicode here,
122+
* unless we pretend that we can redefine the MD-5
123+
* algorithm for multi-byte characters (perhaps
124+
* by adding every four 16-bit characters and
125+
* shortening the sum to 32 bits). Otherwise
126+
* I suggest performing MD-5 as if every character
127+
* was two bytes--e.g., 0040 0025 = @%--but then
128+
* how will an ordinary MD-5 sum be matched?
129+
* There is no way to standardize text to something
130+
* like UTF-8 before transformation; speed cost is
131+
* utterly prohibitive. The JavaScript standard
132+
* itself needs to look at this: it should start
133+
* providing access to strings as preformed UTF-8
134+
* 8-bit unsigned value arrays.
135+
*/
136+
function md5blk(s) { /* I figured global was faster. */
137+
var md5blks = [], i; /* Andy King said do it this way. */
138+
for (i=0; i<64; i+=4) {
139+
md5blks[i>>2] = s.charCodeAt(i)
140+
+ (s.charCodeAt(i+1) << 8)
141+
+ (s.charCodeAt(i+2) << 16)
142+
+ (s.charCodeAt(i+3) << 24);
143+
}
144+
return md5blks;
145+
}
146+
147+
var hex_chr = '0123456789abcdef'.split('');
148+
149+
function rhex(n)
150+
{
151+
var s='', j=0;
152+
for(; j<4; j++)
153+
s += hex_chr[(n >> (j * 8 + 4)) & 0x0F]
154+
+ hex_chr[(n >> (j * 8)) & 0x0F];
155+
return s;
156+
}
157+
158+
function hex(x) {
159+
for (var i=0; i<x.length; i++)
160+
x[i] = rhex(x[i]);
161+
return x.join('');
162+
}
163+
164+
function md5(s) {
165+
return hex(md51(s));
166+
}
167+
168+
/* this function is much faster,
169+
so if possible we use it. Some IEs
170+
are the only ones I know of that
171+
need the idiotic second function,
172+
generated by an if clause. */
173+
174+
function add32(a, b) {
175+
return (a + b) & 0xFFFFFFFF;
176+
}
177+
178+
if (md5('hello') != '5d41402abc4b2a76b9719d911017c592') {
179+
function add32(x, y) {
180+
var lsw = (x & 0xFFFF) + (y & 0xFFFF),
181+
msw = (x >> 16) + (y >> 16) + (lsw >> 16);
182+
return (msw << 16) | (lsw & 0xFFFF);
183+
}
184+
}

‎2016/solutions/day5.js

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
let fs = require('fs');
2+
let filedata = fs.readFileSync('md5.js','utf8');
3+
eval(filedata);
4+
5+
module.exports = [
6+
// Challenge 1
7+
input => {
8+
let code = '';
9+
let index = 0;
10+
while(code.length < 8) {
11+
let hash = md5(input + index);
12+
if (hash.indexOf('00000') === 0) {
13+
// Found letter!
14+
code += hash[5];
15+
console.log('Found character ' + code.length);
16+
}
17+
index++;
18+
if (index % 1000 === 0) {
19+
console.log('Index ' + index);
20+
}
21+
}
22+
return code;
23+
},
24+
25+
// Challenge 2
26+
input => {
27+
let code = '________';
28+
let numberFound = 0;
29+
let rangeIndex = 0;
30+
let indexRanges = [
31+
[2500000, 2510000],
32+
[7400000, 7430000],
33+
[7730000, 7740000],
34+
[9190000, 9200000],
35+
[14460000, 14470000],
36+
[16500000, 16510000],
37+
[17580000, 17590000],
38+
[25370000, 25380000],
39+
];
40+
let index = indexRanges[rangeIndex][0];
41+
while(numberFound < 8) {
42+
let hash = md5(input + index);
43+
if (hash.substr(0, 5) === '00000') {
44+
// Found letter maybe
45+
let position = parseInt(hash[5]);
46+
if (!isNaN(position) && position < 8 && code[position] === '_') {
47+
code = Array.from(code).map((item, index) => index === position ? hash[6] : item).join('');
48+
numberFound++;
49+
console.log('Found character ' + numberFound + ' - ' + code + ' - ' + hash);
50+
}
51+
}
52+
index++;
53+
if (index > indexRanges[rangeIndex][1]) {
54+
rangeIndex++;
55+
index = indexRanges[rangeIndex][0];
56+
}
57+
if (index % 100000 === 0) {
58+
console.log('Index ' + index);
59+
}
60+
}
61+
return code;
62+
}
63+
64+
];

0 commit comments

Comments
 (0)
Failed to load comments.