裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

シーザー暗号の解読

2021年05月15日 | ブログラミング

シーザー暗号
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.
  :
=====#

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia の小ネタ--024 QR 分解 | トップ | シーザー暗号の解読--その2 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事