Skip to content

Instantly share code, notes, and snippets.

@anthonyclays
Last active August 29, 2015 14:20
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save anthonyclays/ef6bb5b3de296d6d96aa to your computer and use it in GitHub Desktop.
Fully automated caesar rotation decryption using a 2D language entropy table
#!/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")
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
#!/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