-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path65daysdecode.html
More file actions
193 lines (160 loc) · 6.56 KB
/
65daysdecode.html
File metadata and controls
193 lines (160 loc) · 6.56 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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<html>
<script>
/*
This script is an attempt at decoding 65daysofstatic's cryptic instagram posts
from the summer of 2019.
Simply run the code in a chrome browser, results will be logged to the console in developer tools.
Latest version of this and license is here: https://github.com/codercowboy/65daysdecode
original author: jason baker (jason@onejasonforsale.com)
*/
//maps crypted characters to regular alphabet, example: '▜' -> 'a'
var alphabet = new Map();
//characters that we can't find in our alphabet map
var unknownalphabet = new Array();
//maps characters to integer counts
var characterCounts = new Map();
var charcodeforz = "z".charCodeAt(0);
var charcodeforzero = "0".charCodeAt(0);
function add_known_code(encryptedValue, decryptedValue) {
var result = "Now updating alphabet with known code from '" + encryptedValue + "' to '" + decryptedValue + "'.\n";
for (var i = 0; i < encryptedValue.length; i++) {
var encryptedChar = encryptedValue.charAt(i);
var decryptedChar = decryptedValue.charAt(i);
result += "Mapping character #" + i + ": " + print_character_info(encryptedChar) + " -> " + print_character_info(decryptedChar) + "\n";
if (decryptedChar == '?') {
result += "Skipping this character, decryption character is '?', signifying we don't know the mapping for it." + "\n";
continue;
}
var previouslyKnownMappedChar = alphabet.get(encryptedChar);
if (previouslyKnownMappedChar != null) {
result += "Error Pre-existing mapped char '" + print_character_info(encryptedChar) + "' -> "
+ print_character_info(previouslyKnownMappedChar) + "' exists, overriding it with '"
+ print_character_info(decryptedChar) + "'.\n";
}
alphabet.set(encryptedChar, decryptedChar);
}
result += "Finished updating alphabet with known code from '" + encryptedValue + "' to '" + decryptedValue + "'.\n";
return result;
}
function decode(value) {
var result = "";
for (var i = 0; i < value.length; i++) {
var c = value.charAt(i);
var charCode = value.charCodeAt(i);
var replacement = alphabet.get(c);
if ((replacement == null) && (unknownalphabet.indexOf(c) == -1)
&& ((charCode > charcodeforz) || (charCode < charcodeforzero))) {
unknownalphabet.push(c);
}
result += (replacement == null) ? c : replacement;
}
return result;
}
function print_known_alphabet() {
var result = "known characters:\n";
for (c of alphabet.keys()) {
result += print_character_info(c) + " -> "
result += print_character_info(alphabet.get(c)) + "\n";
}
return result;
}
function print_unknown_chars() {
var result = "unknown characters:\n";
for (var i = 0; i < unknownalphabet.length; i++) {
result += print_character_info(unknownalphabet[i]) + "\n";
}
return result;
}
function count_characters(value) {
for (var i = 0; i < value.length; i++) {
var c = value.charAt(i);
var count = characterCounts.get(c);
count = (count == null) ? 1 : (count + 1);
characterCounts.set(c, count);
}
}
function debug_character_counts() {
var knownCounts = [];
console.log(characterCounts);
for (key of characterCounts.keys()) {
var count = characterCounts.get(key);
if (knownCounts.indexOf(count) == -1) {
knownCounts.push(count);
}
}
knownCounts = knownCounts.sort((a, b) => b - a)
var result = "character counts:\n";
for (var i = 0; i < knownCounts.length; i++) {
var knownCount = knownCounts[i];
console.log(knownCount);
for (key of characterCounts.keys()) {
var count = characterCounts.get(key);
if (!(knownCount == count)) {
continue;
}
result += key + " occurred " + count + " times";
var mappedChar = alphabet.get(key);
result += (mappedChar == null) ? " (unmapped)" : ("(mapped to '" + mappedChar + "')");
result += ".\n";
}
}
return result;
}
function debug_alphabet() {
var fullAlphabet = new Map();
for (c of alphabet.keys()) {
fullAlphabet.set(c, alphabet.get(c));
}
for (var i = 0; i < unknownalphabet.length; i++) {
fullAlphabet.set(unknownalphabet[i], null);
}
var allKeys = [];
for (key of fullAlphabet.keys()) {
allKeys.push(key);
}
allKeys = allKeys.sort();
var result = "alphabet debug:\n";
for (var i = 0; i < allKeys.length; i++) {
var key = allKeys[i];
result += print_character_info(key) + " -> " + print_character_info(fullAlphabet.get(key)) + "\n";
}
return result;
}
function print_character_info(c) {
if (c == null) {
return null;
}
return c + " (" + c.charCodeAt(0) + ")";
}
var messages = [ "6▜d▋▍▟o▞▝▐a▝░", "▂e▄l▀c▖░▟▍▎▏▛", "r▌p▒▊▋▗▐▂▐▟", , "{▙e▉_▆r▐▜l▁█r}",
"r▐▜l▁cr▍▎▏▛", "▊▔r▐▓▄▊▛▞▎▍▖▎▟", "▉▐▄▅▎▋▁▐▋65▄ep▋", "r▅p▖▊c▙//▖/2019", "▜▜▞▏▚▕▋▒▂▝░▋░",
"▍▂█▜▂▇▉▀▓▒", "||▂|▒▅▊▒▂▟", "▆▟▉▗▘020▚0▔||", "▓▂r▒▒rr▓▍rr▅", "█r▇▟▖r▃▟▛▖▗r",
"l▋▅▐▟▛pl▛▚r", "▞>▞▂▚▕▋▎▗;░e", "▜▇▒▅▇▔▀▃▛▘", "r▓▂r▒▒rr▓▍rr▅", "█r▇▟▖r▃▟▛▖▗",
"r▖▞l▁▗▆,▄▎▉▌", "▀█▜▎▊▙▛▋▒▗▔▌r", "▁▇▃l▟▖█▁▓█▌▃", "▌▖▜░▏▍▎▏▛", "▋▒▊▃▚" ];
var finalResult = "";
finalResult += add_known_code("6▜d▋▍▟o▞▝▐a▝░", "65daysofstati");
/*
experiments for english language most common letter numbering based on character counts from existing messages:
most common letters in english language: e t a o i n s r h l d c u m f p g w y b v k x j q z
most common letters in english language w/ already mapped s and a removed: e t o i n r h l d c u m f p g w y b v k x j q z
r occurred 26 times (unmapped) - most common letter, could be e
▟ occurred 12 times(mapped to 's'). (skipped)
▒ occurred 12 times (unmapped) - second most common letter, could be t
▋ occurred 11 times(mapped to 'a'). (skipped)
▖ occurred 11 times (unmapped) - third most common letter, could be o
this doesn't help though, it's still a jumbled mess when we add this..
finalResult += add_known_code("r▒▖", "eto");
*/
finalResult += "\ndecoded posts:\n";
for (var i = 0; i < messages.length; i++) {
if (messages[i] != null) {
var message = messages[i];
count_characters(message);
finalResult += message + " -> " + decode(message) + "\n";
}
}
finalResult += "\n" + debug_alphabet() + "\n";
finalResult += "\n" + debug_character_counts() + "\n";
console.log(finalResult);
</script>
</html>