シーザー暗号
https://oku.edu.mie-u.ac.jp/~okumura/python/gettysburg.html
cryptogram = """pyeb cmybo kxn cofox iokbc kqy yeb pkdrobc lbyeqrd pybdr yx drsc
myxdsxoxd, k xog xkdsyx, myxmosfon sx vslobdi, kxn nonsmkdon dy dro
zbyzycsdsyx drkd kvv wox kbo mbokdon oaekv.
xyg go kbo oxqkqon sx k qbokd msfsv gkb, docdsxq grodrob drkd xkdsyx,
yb kxi xkdsyx cy myxmosfon kxn cy nonsmkdon, mkx vyxq oxnebo. go kbo
wod yx k qbokd lkddvo-psovn yp drkd gkb. go rkfo mywo dy nonsmkdo k
zybdsyx yp drkd psovn, kc k psxkv bocdsxq zvkmo pyb dryco gry robo
qkfo drosb vsfoc drkd drkd xkdsyx wsqrd vsfo. sd sc kvdyqodrob psddsxq
kxn zbyzob drkd go cryevn ny drsc.
led, sx k vkbqob coxco, go mkx xyd nonsmkdo -- go mkx xyd myxcombkdo
-- go mkx xyd rkvvyg -- drsc qbyexn. dro lbkfo wox, vsfsxq kxn nokn,
gry cdbeqqvon robo, rkfo myxcombkdon sd, pkb klyfo yeb zyyb zygob dy
knn yb nodbkmd. dro gybvn gsvv vsddvo xydo, xyb vyxq bowowlob grkd go
cki robo, led sd mkx xofob pybqod grkd droi nsn robo. sd sc pyb ec dro
vsfsxq, bkdrob, dy lo nonsmkdon robo dy dro expsxscron gybu grsmr droi
gry pyeqrd robo rkfo drec pkb cy xylvi knfkxmon. sd sc bkdrob pyb ec
dy lo robo nonsmkdon dy dro qbokd dkcu bowksxsxq lopybo ec -- drkd
pbyw droco ryxybon nokn go dkuo sxmbokcon nofydsyx dy drkd mkeco pyb
grsmr droi qkfo dro vkcd pevv wokcebo yp nofydsyx -- drkd go robo
rsqrvi bocyvfo drkd droco nokn crkvv xyd rkfo nson sx fksx -- drkd
drsc xkdsyx, exnob qyn, crkvv rkfo k xog lsbdr yp pboonyw -- kxn drkd
qyfobxwoxd yp dro zoyzvo, li dro zoyzvo, pyb dro zoyzvo, crkvv xyd
zobscr pbyw dro okbdr."""
「平文に直せ」というプログラムをいかに書くかという問題の解説
シーザー暗号がどういうものであるか(特定の文字を、それよりも辞書順に特定の数だけ後ろ(または前)にある文字と置き換える)がわかっていれば,そして平文が我々の未知の言語ではないと仮定できるなら,ブルートフォースで解くのが簡単だ。
平文は長くなくてもよい(長くしているのは,文字頻度を調べるためにすぎない)ので,冒頭だけを取り上げる。
cryptogram = """pyeb cmybo kxn cofox iokbc kqy yeb pkdrobc lbyeqrd pybdr yx drsc
myxdsxoxd, k xog xkdsyx, myxmosfon sx vslobdi, kxn nonsmkdon dy dro
zbyzycsdsyx drkd kvv wox kbo mbokdon oaekv."""
c = Char[cryptogram...];
# c ="abcdefghijklmnopqrstuvwxyz" # プログラムのテスト用
以下を実行すれば,25 通りの解読例が出力されるので,ちらっと見ただけで,正解がわかる。
for i = 1:25
text = ""
for j in c
code = Int(j)
if 'a' <= j <= 'z'
code += i
code = code > Int('z') ? code - Int('z') + Int('a') - 1 : code
end
text = text * string(Char(code))
end
println("$i: $text\n")
end
#=====
:
15: entq rbnqd zmc rdudm xdzqr zfn ntq ezsgdqr aqntfgs enqsg nm sghr
bnmshmdms, z mdv mzshnm, bnmbdhudc hm khadqsx, zmc cdchbzsdc sn sgd
oqnonrhshnm sgzs zkk ldm zqd bqdzsdc dptzk.
16: four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in liberty, and dedicated to the
proposition that all men are created equal.
17: gpvs tdpsf boe tfwfo zfbst bhp pvs gbuifst cspvhiu gpsui po uijt
dpoujofou, b ofx obujpo, dpodfjwfe jo mjcfsuz, boe efejdbufe up uif
qspqptjujpo uibu bmm nfo bsf dsfbufe frvbm.
:
=====#