プログラミングの勉強をしていると後輩に話したら、「ある程度(繰り返し処理)まで学習が進んだら、シーザー暗号を解くプログラムを作るのがおすすめです。」と言われた。
すげー大変で、めちゃくちゃ調べながら20時間くらいかかったけど、なんとなく出来た。絶対もっと慣れてから勧めないといけない難しいやつ…。
解読の仕方や考え方などを書き出してみる。ソースコードを置いておくが、最後のあたり(最後どころか全体的に)あんまり自信がない。まじで初心者が書いたものなので注意。
シーザー暗号とは
シーザー暗号は単一換字式暗号の一種で、平文の各文字を、辞書順に3文字分シフトして暗号文を作る暗号である
難しく書いてあるが、”特定の文字数分だけずらす”という暗号。アルファベットで、”APPLE”を1文字ずらすとしたら”BQQMF”になるよ。っていう暗号。
問題文とプログラム作成の考え方
・問題文はFRQJUDWXODWLRQV BRX KDYH VXFHHGHG WR GHFUBSW WKH FHDVDU FLSKHUとなる。
これの解読に励む。考え方としては単純。アルファベットを1文字ずつずらした場合、2文字ずつずらした場合…25文字ずつずらした場合をすべて作成、意味がわかる文字列が正解(アルファベットは全部で26種類なので、25通りでよい。26字ずつずらしたら元の文と同じ。)。先ほど勉強した繰り返し処理を使うことは容易に想像できる。
・当然のことながら、文字(アルファベット)では計算ができない。アルファベットを数字に直す必要がある。(数字に直さず、なんか配列の考え方でもできそうだけど、配列今は難しくてわからん。)
・PCは(極端な話)、二進数しか扱えない(0or1)。つまり文字データも二進数(数字)で表現されるはず。検索すると、ASCIIコード表を発見。これをもとに、今回の問題文”大文字アルファベット”に対応する数字を確認。アスキーコードだと”A”が”65″…”Z”が”90″に対応している。
・それぞれの値にそれぞれ足し算してやればいい。”AB”を1ずらすとしたら、”65+1 66+1”となる。ただ、91からZでなくなる(アスキーコードで”91″は”[“)、90(Z)のつぎは65(A)になるようにしなければならない。…ピンと来たぞ。これが条件分岐だ。あぁ、大変。
解法
難しく考えても全く手が進まなかった。できることを一つずつやっていこう。
とりえず、1ずつずらした場合のみを考えて解いてみる。テキストボックスに入力された文字列・文字数を取得する必要がある。
そして、入力された文字を数字に変換する必要がある。そして+1を計算。その後また文字列に変換してリッチテキストボックスに出力。…という具合。
コメントごちゃごちゃ書いてあって、見づらいと思うが、ご容赦を。ソースコードもあやふやで、合っている自信がない…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim 文字入力 As String Dim 文字数 As Integer Dim 文字列情報 As String Dim アスキー As Integer Dim 変換後文字列 As String 文字入力 = TextBox1.Text 'LEN 関数は、文字列の文字数を返す。 文字数 = Len(文字入力) '入力した文字数分の繰り返し処理 For i = 1 To 文字数 '一文字ずつ値を取り出す必要がある。Mid関数。 文字列情報 = Mid(文字入力, i, 1) 'string型(文字列)だからそれを数字(アスキー、integer)に変換。 'Asc関数。文字の文字コードを整数型(Integer)で返します。 アスキー = Asc(文字列情報) '1ずつずらす計算をする。 アスキー = アスキー + 1 '90より大きくなった場合、65からに戻さないといけない。26を引く。 If アスキー > 90 Then アスキー = アスキー - 26 End If 'アスキーコードを文字列stringに戻す。Chr関数。 'ここで警告が出てる。うーむ。 変換後文字列 = 変換後文字列 & Chr(アスキー) Next RichTextBox1.AppendText(変換後文字列) End Sub End Class |
※なかなかリッチテキストボックスに出力する関数がわからなかったけど、richtextbox1.と打った後に、使える関数一覧がVsiual studioで表示される。そこでappendtext発見。web検索してメソッドなどを探すより、ヘルプ見た方が分かりやすいのでは?
・・・
・・
・
そしてここまでできると、後もできる。足す数に気をつけて、1から25回繰り返し処理すればいい。暗号解読完成形↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim 文字入力 As String Dim 文字数 As Integer Dim 文字列情報 As String Dim アスキー As Integer Dim 変換後文字列 As String 文字入力 = TextBox1.Text 文字数 = Len(文字入力) '1から25回繰り返す For j = 1 To 25 For i = 1 To 文字数 文字列情報 = Mid(文字入力, i, 1) アスキー = Asc(文字列情報) '変数j分をずらす計算。(32はアスキーコードだとスペース。除外) If (アスキー <> 32) Then アスキー = アスキー + j End IF If アスキー > 90 Then アスキー = アスキー - 26 End If 変換後文字列 = 変換後文字列 + Chr(アスキー) Next RichTextBox1.AppendText(変換後文字列) 変換後文字列 = vbCrLf Next End Sub |
暗号作成も全く同じやり口で。暗号化したい原文をテキストボックスに入力。リッチテキストに暗号化された25通りの暗号文が作成される。
・・・
・・
・

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span style="font-family: MS Pゴシック; font-size: medium;"> |:::::::::::::::::::::::::::/ \:::::::::::::::::/ |:::::/ |::::::::::::::::::::::::/ \::::::::/ |::/ |:::::::::::::::::::::/. `'''´ | |::::::::::::::::::/i"'''‐- ..,, ,,..-''"i CONGRATULATIONS! |:::::::::::::::〈 "'''‐-.., "''i i ,.-'"| |:::::/⌒Y〒〒-====‐-‐====-i |::::| ( `|:::| ||||||||||||||||!‐‐‐|!|||||||||! シーザー暗号復号化・・・・・・! |:::.!, じ.|::|. !||||||||||||!| .|!|||||||! |::::::'‐-|::|  ̄ ̄ | .|  ̄ | 成功だ・・・・・・! . , -|::::::::::/||: L .__ j | . /::::::|:::::::/ :::ヽ -‐‐‐‐‐‐‐‐- |,,, __ /::::::::|:::::/ ::::ヽ ━ |::::::::::"'' ::::::::::|::/ ::::ヽ |:::::::::::::::: :::::::::|〈 ::::::ゝ _________ ノ::::::::::::::::: ::::::::| \ :::::::::::::::::::::::::/ |:::::::::::::::::::::::::</span> |