Fully automated caesar rotation decryption using a 2D language entropy table
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env julia | |
const ENTROPY_MAP_2D = open("entropy.csv") do f | |
readdlm(f, ',') | |
end | |
# Returns index 1:26 for a-z, 27 for space | |
function get_index_for(ch) | |
if 'a' <= ch <= 'z' | |
return int(ch - 96) | |
else | |
return 27 | |
end | |
end | |
isallowed(c) = ('a' <= c <= 'z') || c == ' ' | |
function normalize(text) | |
text = replace(text, '\n', ' ') | |
text = lowercase(text) | |
text = filter(isallowed, text) | |
text | |
end | |
function calculate_entropy(text) | |
text = normalize(text) | |
isempty(text) && return 0.0 | |
ant | |
tot = 0 | |
len = length(text) | |
ind2 = get_index_for(text[1]) | |
for i in 2:len | |
ind1 = ind2 | |
ind2 = get_index_for(text[i]) | |
tot += log2(ENTROPY_MAP_2D[ind1, ind2]) | |
end | |
-tot / len | |
end | |
function rotn(str, n) | |
n = (n + 26) % 26 | |
result = IOBuffer() | |
for ch in str | |
if 'a' <= ch <= 'z' | |
i = (ch - 97 + n) % 26 | |
write(result, i + 97) | |
elseif 'A' <= ch <= 'Z' | |
i = (ch - 65 + n) % 26 | |
write(result, i + 65) | |
else | |
write(result, ch) | |
end | |
end | |
bytestring(result) | |
end | |
function break_caesar(s) | |
rotations = map(i -> rotn(s, i), 1:26) | |
rot_with_entropy = map(rot -> (calculate_entropy(rot), rot), rotations) | |
println("Entropy\tString") | |
for (entropy, str) in sort(rot_with_entropy) | |
@printf "%2.2f\t%s\n" entropy str | |
end | |
end | |
# tests | |
break_caesar("ebiil tloia") | |
break_caesar("GUVF VF FBZR FNZCYR GRKG URER.") | |
break_caesar("Nyrk kyv wltb uzu pfl aljk wltbzex jrp rsflk dv, pfl czkkcv szkty?") | |
break_caesar("Elorj ljkfrj cloqfppfjf prkq Ybidxb") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8045667207067314e-21 | .0009578813791525141 | .0017459097839336072 | .0034346059343947355 | 24583983132705682e-21 | .0003964726007038171 | .0010347621991311574 | 2860681673623934e-20 | .003164629101446477 | 4067531754684031e-20 | .0011254994459664164 | .004282082880205826 | .0018782163113387142 | .016328681596743114 | 21008131040675763e-21 | .0010432548478497283 | 4022833603533657e-21 | .005352156618745779 | .0068401580705417285 | .008752344976754726 | .0006955032318998189 | .0021812697761382496 | .0004626258644063706 | 23243038598194462e-21 | .0021540039039365214 | .00011398028543345361 | .004494399098170103 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
.000877424707081841 | 7375194939811704e-20 | 1e-22 | 5363778138044876e-21 | .00439963901773131 | 8939630230074794e-22 | 1e-22 | 35758520920299174e-22 | .00027087079597126626 | 6704722672556096e-20 | 1e-22 | .000982018380773716 | 1206850081060097e-20 | 1340944534511219e-21 | .0011840540239734063 | 1e-22 | 1e-22 | .0007844525526890631 | .00020292960622269782 | .0001318595458936032 | .0013042920505679124 | 35758520920299174e-22 | 1e-22 | 1e-22 | .0010334212545966461 | 1e-22 | 6928213428307964e-20 | |
.0024436479233909446 | 1e-22 | .00033255424455878234 | 1e-22 | .0030211480362537764 | 1e-22 | 1e-22 | .004596310882792955 | .0008908341524269532 | 1e-22 | .0007576336619988387 | .0006172814673866644 | 1e-22 | 1e-22 | .003385884949640828 | 1e-22 | 3352361336278048e-20 | .000528779128108924 | 1653831592563837e-20 | .000985594232865746 | .0005949323918114775 | 1e-22 | 4469815115037397e-22 | 1e-22 | 9520706195029655e-20 | 1e-22 | .00012515482322104712 | |
.0009373202296233421 | 11174537787593492e-21 | 12962463833608451e-21 | .0002650600363217176 | .00367061217246871 | 2547794615571316e-20 | .00013141256438209945 | 8492648718571053e-21 | .0019680595951509657 | 6704722672556095e-21 | 4469815115037396e-21 | .0003379180226968272 | 7911572753616192e-20 | 9163120985826663e-20 | .002953206846505208 | 4916796626541137e-21 | 8939630230074794e-22 | .0006409714874963627 | .0008872583003349232 | 15197371391127149e-21 | .0006467822471459113 | .00025924927667216903 | 3397059487428421e-20 | 1e-22 | .0005381657398505025 | 1e-22 | .0229368562628144 | |
.005215827257737138 | .00011442726694495736 | .0015295707323657972 | .007090914698495326 | .00319010704760219 | .0008617803541792101 | .00047648229126298646 | .0001497388063537528 | .0013025041245218975 | 4022833603533657e-20 | .00010369971066886761 | .0038467228880011838 | .00205700891594021 | .0076205877896272575 | .00019667186506164546 | .0010517474965682995 | .00013901125007766303 | .012215110746374198 | .006535316679696178 | .0022813936347150874 | 2681889069022438e-20 | .0013699983327589622 | .00043535999220464247 | .0006320318572662879 | .0016556195186098518 | 5363778138044876e-20 | .037914759731793216 | |
.0012752382523201693 | 1e-22 | 35758520920299174e-22 | 1340944534511219e-21 | .001346308312649264 | .0006548279143529786 | 8939630230074794e-22 | 2681889069022438e-21 | .0010754375166779977 | 1e-22 | 1e-22 | .00032272065130570005 | 1e-22 | 8939630230074794e-22 | .003752856770585398 | 1340944534511219e-21 | 1e-22 | .0011371209652655137 | 25924927667216903e-21 | .0005024072189302034 | .0005265442205514054 | 1e-22 | 31288705805261775e-22 | 1e-22 | 4246324359285527e-20 | 1e-22 | .007983536776968295 | |
.0009440249522958982 | 4022833603533657e-21 | 17879260460149587e-22 | 4291022510435901e-20 | .001713727115105338 | 2681889069022438e-21 | .00013454143496262563 | .00233547839760704 | .0009507296749684543 | 1e-22 | 1e-22 | .0002208088666828474 | 2503096464420942e-20 | .00021499810703329877 | .0016538315925638367 | 8492648718571053e-21 | 1e-22 | .0010146480311134891 | .000345069726880887 | 822445981166881e-19 | .0004572620862683257 | 1e-22 | 35758520920299174e-22 | 1e-22 | 16091334414134628e-21 | 1e-22 | .005134476622643457 | |
.009995400560246627 | 4201626208135153e-20 | 2234907557518698e-21 | 1564435290263089e-20 | .023141573795083113 | 25924927667216903e-21 | 4469815115037397e-22 | 4916796626541137e-21 | .008389842970925194 | 1e-22 | 1e-22 | 5676665196097494e-20 | 5676665196097494e-20 | 4201626208135153e-20 | .005948429955091768 | 31288705805261775e-22 | 1e-22 | .0004586030308028369 | 9297215439277785e-20 | .0016247777943160938 | .0004112229905834405 | 1e-22 | 17432278948645848e-21 | 1e-22 | .00044072377034268733 | 1e-22 | .005248903889588415 | |
.0006516990437724524 | .00029813666817299437 | .0021683073123046413 | .002524104595461618 | .001956885057363372 | .0014294468737889594 | .0017847971754344325 | 2234907557518698e-21 | 7688081997864322e-20 | 31288705805261775e-22 | .0003535623755994581 | .0026121599532278545 | .0029456081608096444 | .013133657752514382 | .001900565386913901 | .00048765682905057997 | 1430340836811967e-20 | .0018379879753033775 | .007694786720536879 | .007061860900247583 | 2637190917872064e-20 | .0012940114758033263 | 8939630230074794e-22 | .0011791372273468653 | 1e-22 | 6660024521405721e-20 | .0029777908296379136 | |
46933058707892666e-21 | 1e-22 | 1e-22 | 1e-22 | .00020695243982623147 | 1e-22 | 1e-22 | 1e-22 | 8492648718571053e-21 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | .00019845979110766042 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | .00027802250015532607 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 4469815115037397e-22 | |
17879260460149585e-21 | 5363778138044876e-21 | 2234907557518698e-21 | 8939630230074794e-22 | .002006946986651791 | 4022833603533657e-21 | 8939630230074794e-22 | 9833593253082273e-21 | .0007071247511989162 | 1e-22 | 4469815115037397e-22 | 6257741161052356e-20 | 31288705805261775e-22 | .0010526414595913068 | 24583983132705682e-21 | 2234907557518698e-21 | 1e-22 | 2681889069022438e-21 | .0003209327252596851 | 1340944534511219e-21 | 4916796626541137e-21 | 1e-22 | 5810759649548616e-21 | 1e-22 | 37099465454810394e-21 | 1e-22 | .0013208303664935506 | |
.00265104734472868 | 2994776127075056e-20 | .00019443695750412675 | .0021616025896320852 | .004877015272017304 | .0008747428180128186 | 4022833603533657e-20 | 17879260460149587e-22 | .002861575636646941 | 4469815115037397e-22 | .00011576821147946857 | .005024519170813538 | .00019801280959615668 | 14750389879623409e-21 | .002197808092063888 | .00010459367369187508 | 4916796626541137e-21 | .00017521675250946594 | .0005332489432239614 | .0004930206071886248 | .0004246324359285527 | .0002409230347005157 | 7822176451315444e-20 | 1340944534511219e-20 | .0016587483891903779 | 1e-22 | .004877462253528807 | |
.00336219492953113 | .0003312133000242711 | 4469815115037397e-22 | 1e-22 | .005022731244767523 | 31735687316765514e-21 | 4469815115037397e-22 | 8939630230074794e-22 | .0015532607524754954 | 1e-22 | 1e-22 | 2503096464420942e-20 | .00023600623807397455 | 23243038598194462e-21 | .0020874036587224644 | .000779535756062522 | 4469815115037397e-22 | 19667186506164547e-21 | .0008434541122075567 | 4469815115037396e-21 | .0006074478741335822 | 1e-22 | 4469815115037397e-22 | 1e-22 | .0014741450249393334 | 1e-22 | .0041104419797883904 | |
.0011536592811911522 | 5497872591495998e-20 | .002944267216275133 | .01135243642917198 | .0041368138889671105 | .00020248262471119407 | .006226452455247094 | 46039095684885184e-21 | .0015523667894524879 | 844795056742068e-19 | .0003303193370012636 | .0003540093571109618 | 8313856113969558e-20 | .00043893584429667234 | .004717442872410468 | 1653831592563837e-20 | 7196402335210209e-20 | 15197371391127149e-21 | .0018916257566838264 | .0049471913693233905 | .0001635952332103687 | .00015376163995728644 | 31735687316765514e-21 | 29053798247743077e-21 | .0008617803541792101 | .00016851202983690985 | .013754068090481573 | |
.0004004954343073507 | .00043089017708960504 | .00043267810313562 | .0012153427297786682 | .0002739996665517924 | .006500005140287382 | .00020203564319969033 | 34864557897291695e-21 | .0005180515718328343 | 4738004021939641e-20 | .0006767300084166619 | .0013284290521891143 | .003131999451106704 | .00844213980777113 | .001916209739816532 | .0006432063950538814 | 3352361336278048e-20 | .008707646825604352 | .0017964186947335297 | .004373714090064092 | .008705411918046834 | .0011894178021114512 | .002663115845539281 | 21008131040675763e-21 | .0001711939189059323 | 17879260460149585e-21 | .011791372273468652 | |
.0014933652299339943 | 31288705805261775e-22 | 1e-22 | 1340944534511219e-21 | .002095002344418028 | 4022833603533657e-21 | 4469815115037396e-21 | .0001926490314581118 | .0005681135011212531 | 1e-22 | 2681889069022438e-21 | .0013503311462527976 | 6257741161052355e-21 | 2234907557518698e-21 | .0013758090924085107 | .0007026549360838787 | 1e-22 | .001516161287020685 | .00021812697761382495 | .0005050891079992258 | .0004965964592806548 | 1e-22 | 8939630230074793e-21 | 1e-22 | 889493207892442e-19 | 1e-22 | .0011187947232938603 | |
1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | .0018831331079652552 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | |
.0027028972000631138 | .00018728525332006692 | .00042418545441704896 | .0015304646953888045 | .010450874720468937 | .00010772254427240126 | .00029903063119600187 | 9163120985826663e-20 | .003001033868236108 | 14750389879623409e-21 | .00021902094063683245 | .0004112229905834405 | .0005739242607708017 | .0010186708647170228 | .0034498033057858628 | .0001591254180953313 | 10280574764586013e-21 | .0008810005591738709 | .002486558148495304 | .0020744411948888557 | .0007272389192165844 | .0004617319013833631 | 8939630230074793e-20 | 1e-22 | .0014008400570527202 | 8939630230074794e-22 | .011976422619231201 | |
.004045182679108844 | 7285798637510957e-20 | .0006257741161052355 | 21008131040675763e-21 | .0067011468204640654 | .00015689051053781263 | 20561149529172026e-21 | .0027824599091107794 | .002050304193267654 | 8939630230074794e-22 | .0003222736697941963 | .00036697182094457025 | .00019220204994660806 | 46486077196388925e-21 | .0027945284099213804 | .0008309386298854521 | .0001770046785554809 | 5810759649548616e-21 | .0021987020550868954 | .005304776578526383 | .0012868597716192665 | 4469815115037396e-21 | .0003718886175711114 | 1e-22 | .00010235876613435638 | 1e-22 | .02080564841596457 | |
.0019171037028395395 | 7151704184059835e-21 | .0001868382718085632 | 8939630230074794e-22 | .006540680457834223 | 32629650339772996e-21 | 4916796626541137e-21 | .02696952345960114 | .0034024232655664663 | 4469815115037397e-22 | 1e-22 | .0007697021628094397 | 9744196950781525e-20 | 5363778138044876e-20 | .008234293404921893 | 1206850081060097e-20 | 1e-22 | .0018813451819192403 | .0013641875731094134 | .0011304162425929576 | .001212213859198142 | 1e-22 | .0003978135452383283 | 4469815115037397e-22 | .0009194409691631925 | 1e-22 | .020603165791253375 | |
.00032987235548975985 | .00030350044631103924 | .0010361031436656686 | .000346857652926902 | .0008398782601155268 | .00010504065520337883 | .001024928605878075 | 1e-22 | .0016949538916221807 | 4469815115037397e-22 | .00011710915601397979 | .0021571327745170477 | .0003625020058295329 | .0023001668581982444 | 49614947776915106e-21 | .0009198879506746963 | 4469815115037397e-22 | .0036066938163236755 | .002429344515022825 | .00314228002587129 | 1e-22 | 17879260460149587e-22 | 1e-22 | 8492648718571053e-21 | 1430340836811967e-20 | 11621519299097231e-21 | .001612262311993989 | |
.0006338197833123028 | 1e-22 | 1e-22 | 1e-22 | .006163428062125067 | 1e-22 | 1e-22 | 1e-22 | .0012131078222211494 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | 1e-22 | .00028472722282788215 | 1e-22 | 1e-22 | 4469815115037397e-22 | 1e-22 | 1e-22 | 10727556276089752e-21 | 1e-22 | 1e-22 | 1e-22 | 2860681673623934e-20 | 1e-22 | 23690020109698204e-21 | |
.002748936295747999 | 4469815115037396e-21 | 31288705805261775e-22 | 22349075575186983e-21 | .0025160589282545508 | 21008131040675763e-21 | 35758520920299174e-22 | .004265544564280187 | .0035986481491166082 | 1e-22 | 4022833603533657e-21 | 5944854102999738e-20 | 4469815115037396e-21 | .000635160727846814 | .0021119876418551698 | 17879260460149587e-22 | 1e-22 | .00022036188517134367 | .00020337658773420154 | 31288705805261775e-22 | 1e-22 | 1e-22 | 7598685695563574e-21 | 1e-22 | 4469815115037396e-21 | 1e-22 | .0017123861705708268 | |
9610102497330403e-20 | 4469815115037397e-22 | .0001904141239005931 | 1e-22 | 9386611741578533e-20 | 1e-22 | 1e-22 | 7151704184059835e-21 | .00010638159973789004 | 1e-22 | 1e-22 | 17879260460149585e-21 | 35758520920299174e-22 | 1e-22 | .001047277681453262 | .0001591254180953313 | 8939630230074794e-22 | 1e-22 | 2234907557518698e-21 | .00013051860135909198 | 5363778138044876e-21 | 2503096464420942e-20 | 1e-22 | 58107596495486154e-21 | 1340944534511219e-21 | 1e-22 | 934191359042816e-19 | |
8939630230074793e-20 | 4782702173090014e-20 | 31288705805261775e-22 | 4916796626541137e-21 | .0005001723113726847 | 10727556276089752e-21 | 2234907557518698e-21 | 8492648718571053e-21 | .00033166028153577484 | 1e-22 | 1e-22 | 51849855334433805e-21 | 4782702173090014e-20 | 8492648718571053e-21 | .001948839390156305 | 19220204994660805e-21 | 1e-22 | 30394742782254297e-21 | .0006315848757547842 | .0001622542886758575 | 4469815115037397e-22 | 1e-22 | 16091334414134628e-21 | 1e-22 | 4469815115037397e-22 | 1e-22 | .010940766457077035 | |
.00017968656762450334 | 1e-22 | 1e-22 | 1e-22 | .00014795088030773783 | 1e-22 | 1e-22 | 1e-22 | 17432278948645848e-21 | 1e-22 | 1e-22 | 9386611741578534e-21 | 1340944534511219e-21 | 1e-22 | 5989552254150112e-20 | 8939630230074794e-22 | 8939630230074794e-22 | 1e-22 | 8939630230074794e-22 | 1e-22 | 2681889069022438e-21 | 1e-22 | 1e-22 | 1e-22 | 1564435290263089e-20 | 10280574764586013e-21 | 4738004021939641e-20 | |
.02237142465076217 | .008427389417891508 | .006584931627473093 | .006429829042981295 | .003068975057984677 | .007210705743578329 | .003913323133215241 | .01447683719458312 | .013207856683424004 | .00043267810313562 | .001461182561105725 | .0045811135114018275 | .008519020627749774 | .004312477622988081 | .01216996561371232 | .004802369359596179 | .0013910064637996378 | .0037179922126881065 | .013726355236768342 | .03202801322528896 | .001916209739816532 | .0011733264676973166 | .013523425630545644 | 7419893090962079e-20 | .002101707067090584 | 5095589231142632e-20 | .002985836496844981 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env julia | |
isallowed(c) = ('a' <= c <= 'z') || c == ' ' | |
function readinput(istream) | |
text = readall(istream) | |
text = replace(text, '\n', ' ') | |
text = lowercase(text) | |
text = filter(isallowed, text) | |
text | |
end | |
# Returns index 1:26 for a-z, 27 for space | |
function get_index_for(ch) | |
if 'a' <= ch <= 'z' | |
return int(ch - 96) | |
else | |
return 27 | |
end | |
end | |
function generate_entropy_map(text) | |
count_map = zeros(Int, 27, 27) | |
ind2 = get_index_for(text[1]) | |
len = length(text) | |
for i in 2:len | |
ind1 = ind2 | |
ind2 = get_index_for(text[i]) | |
count_map[ind1, ind2] += 1 | |
end | |
map(i -> i / len, count_map) # Normalize | |
end | |
function main() | |
text = readinput(STDIN) | |
entropy_map = generate_entropy_map(text) | |
# substitute zeros with small values | |
map!(i -> (i == 0.0) ? 1e-20 : i, entropy_map) | |
open("entropy.csv", "w") do file | |
writedlm(file, entropy_map, ',') | |
end | |
end | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment