わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

unigram, bigram, trigram

f:id:takehikom:20190428021615j:plain
「歴史上の暗号について,解読の方法がほぼ確立しています.
 だから歴史上の暗号をそのまま使用してはいけないとも言えますし,そういった解読のしかたは,現代暗号にも適用できるのではないかと考えることもできます.
 まずシーザー暗号については,ブルート・フォース・アタックで容易に解読できます.鍵は,アルファベットの中で何文字ずらすかという数になりますので,『1文字ずらす』『2文字ずらす』をやっていって,意味のあるメッセージになったら,アタリというわけです.
 単一換字暗号は,アルファベットの字数の階乗が,鍵空間の大きさとなるので,ブルート・フォース・アタックを使うわけにいきません.でも解読は容易でして,『言語の統計的性質』というのを活用します.
 英文では,『e』の文字が,最も多く出現することが知られています.そこで例えば,単一換字暗号の暗号文について,最も出現頻度の高い暗号文の文字は,平文では『e』でないかと推定して,割り当てるのです.ハズレの場合もありますが,そのときは別の文字に割り当てます.日本語でも,同様に,文字ごとの出現頻度が公開されていますし,自分で文章を収集して,少しプログラムを作って,そのデータセットにおける出現頻度を算出することは,決して難しくありません.
 英語にせよ日本語にせよ,それぞれの文字が何回出現するかというのよりも,高度な分析方法があり,それもまた暗号解読において有用となります.英語で例をあげると,『the』という3文字の並びは,他の3文字の並びよりも格段に,よく出現します.定冠詞のtheのほか,theyやthereなどにも,含まれているのです.
 文字列を,連続する文字の並び分ける手法を,『N-gram(エヌグラム)』と言います.また何文字ごとに取り出すかというのによって,結果が異なります.
 1文字ごとに取り出すのは,unigram(ユニグラム)と言います.2文字ごとに取り出すのは,bigram(バイグラム)です…が,間違えると大変なことになる話があるので,例を用いて説明しましょう.日本語の『雨が降れば傘をさす』を使います.
 unigramの処理結果は,単純で,『雨』『が』『降』『れ』『ば』『傘』『を』『さ』『す』です.
 bigramについて,2文字ごとだからまず『雨が』,次は『降れ』…とするのは間違いで,『雨が』の次は『が降』です.最初の2文字,2番目を先頭に2文字,3番目を先頭に2文字,…を取り出していきます.なお末尾は,『さす』でおしまいでもいいですし,『す$』といった形で,テキストには現れない終端記号を入れてこれも1つの語,とする流儀もあります.
 終端記号を入れないことにして,『雨が降れば傘をさす』のbigramはというと,『雨が』『が降』『降れ』『れば』『ば傘』『傘を』『をさ』『さす』となります.
 英語のtheのような,3文字ごとは,trigram(トライグラム)と言います.最初は『雨が降』,次は『が降れ』,残りはいいですね.
 N-gramのNは,1や2や3を含む,任意の正の整数で,その数だけ連続して,文字を取り出して語とします.テキストの長さがMで,終端記号なしのルールだったら,N-gramでM-N+1の語が作られます.ここでは文字ごとに分割しましたが,単語ごとに分割するという使われ方もあります.
 このようにして得られた語を分析することで,こっちのデータセットとあっちのデータセットとは,統計的に中身が異なることが判明した,という研究がなされてきましたし,1台のPCに入れて使う全文検索エンジンで単語分割の方法にN-gramが選べる,といった形でも普及が進んでいます.
 Cまたは他の言語のプログラミングで,文字列の処理に苦労した経験のある人は,その経験を生かして,暗号解読のレポート課題を効率良く,解いてほしいと期待して,次のトピックに移りたいと思います(スライドを進める)」