キミも未来のトビラをひらこう!!
暗号を学ぼう
今回は、暗号の生成と解読をプログラミングで実現していくよ。 「ろすをさきべしねきんへ」みんなは、この暗号を解くことができるかな? このレッスンを通じて、暗号の仕組みを学ぼう。
lockのスプライトをクリックすると入力が求められるよ。 ひらがなで、「りんご」と入力すると、暗号リストに「ぱいき」と表示されたね。 「ぱいき」が暗号なんだ。 今度はopenのスプライトをクリックして、「ぱいき」と入力してみよう。 平文リストに「りんご」と表示されるね。 暗号には鍵があり、今回は27としているよ。 友達と27が鍵であるということを共有しておけば、友達は解読することができるよ。 ただし、シーザー暗号だと分かっていれば、コンピューターを使うと簡単に解読できてしまうこともできるよ。
Attackerのスプライトをクリックして、「ぱいき」と入力してみよう。 鍵を1つずつ試して、「解読候補」に言葉が入力されていくね。 少し時間がかかるので、ターボモードにしてみよう。 まだ遅いようであれば、リスト「ひらがな」を非表示にしよう。 71の単語が「解読候補」に表示されたね。 27番目に「りんご」と表示されているね。 1文字ずつリストと照合する処理、暗号を生みだしたり、解読したりする処理につかわれている制御の仕組みを理解して、これまで学んだプログラミングの知識を整理していこう。 では、実際に作っていこう!
背景とスプライトの初期状態を設定しよう
このチャプターでは、背景とスプライトの設定を確認していくよ。
まずは、lock(ロック)、open(オープン)、Attacker(アタッカー)がアップロードされていることを確認してね。 大きさと位置を調整する処理をつくっていくね。 まずはlockのスプライトだね。
次にopenのスプライトだね。
最後に、Attackerのスプライトだね。
ここまで完成したら、グリーンフラッグを押して動作を確認してみよう。 3つのスプライトが、上から、lock、Attacker、openの順に並んでいればOKだよ。 さあ!ここまで、みんなの画面でもやってみよう!
暗号生成のための鍵、平文、暗号の関係を理解しよう!
このチャプターでは、暗号をつくる処理を作っていくね。 暗号の中でも基本である、シーザー暗号に挑戦するよ。
シーザー暗号とは、決まった数だけ文字をずらす暗号なんだ。 暗号になる前のもとの文字列を「平文(ひらぶん)」、暗号になった文字列を「暗号文」といい、平文を3ずつずらした暗号を例にくわしく説明するね。 「あか」を3ずつずらすと、「あ」は「え」、「か」は「け」となり、暗号文は「えけ」となるよ。 ずらした値3を「鍵」というんだ。
シーザー暗号の処理の流れについて説明するね。 平文も文字列を1文字目から順に平仮名のリストと照合して、発見したら、暗号のリストに追加していくという処理になるよ。 リストの長さや、平文の文字数などが変数となることに注意て処理を作っていくよ。 リスト「ひらがな」をつくろう。 作れたら、リスト上で右クリックして、データhiragana.csvを読み取ろう。 読み取るデータは、テキストをダウンロードしてね。
「あ」から始まり「ぼ」で終わる71の長さであることを確認してね。 変数を4つつくろう。 変数名は、「平文」「鍵」「n」「x」だよ。 「平文」には暗号化されていない文字列、「鍵」はずらす長さ、「n」は平文の何番目であるか、「x」はリスト「ひらがな」の何番目であるか、を表す変数だよ。 さらに、暗号化された文字を格納するリスト「暗号リスト」をつくろう。
準備が整ったので、処理をつくっていこう。 まずはlockのスプライトに、リスト・変数の初期する処理をつくろう。
さらに、平文をユーザーに入力される処理をつくろう。 質問文はあとで変更するよ。
次に、平文を暗号化する処理を順につくっていくよ。 仮に鍵を3とし、平文の1文字目から開始して、 {[「平文」の長さ]回だけ繰り返し}1文字ずつ暗号化していく処理だね。
繰り返す処理は大きく分けて2つあるよ。 平文とリスト「ひらがな」を照合する処理、発見したひらがなを鍵の分だけずらして暗号化する処理だね。
[~まで繰り返す]で発見した平仮名がリスト「ひらがな」の何番目であるかを記憶させていることがポイントだよ。 照合する処理は、平文の[x]番目とリスト「ひらがな」の値が等しいが条件になるね。
鍵の値に応じてずらす処理は、リスト「ひらがな」の[n]+鍵番目を暗号リストに追加するだね。
鍵でずらした結果、リストにない場合を回避しよう
このチャプターでは処理を修正していくよ。 大体の場合は問題ないけど、このままだとうまく動作しないときがあるよ。 例えば、リスト「ひらがな」の最後の方にある「べ」と「ぼ」の場合は、鍵 3だけずらすと72番目や73番目がないね。
これを回避するために、処理を変更していくよ。
まずは、[もし~でなければ]に変更しよう。
72番目の場合は1番目の「あ」、73番目の場合は2番目の「い」とすればいいね。 リスト「ひらがな」の長さ71だけずらそう。 複製を利用してOKだよ。
次に、場合分けの条件を考えよう。 発見されたひらがな[n]番目に鍵の値を足したものが、リスト「ひらがな」の長さを超えてしまったときだね。
最後に、質問文を変更しよう。 ほんとは、ひらがな以外が入力されたときの処理をつくらなければいけないけど、今回は省略するね。 ここまで完成したら、動作を確認してみよう。
グリーンフラッグをクリックして、lockのスプライトをクリックしよう。 「あか」と入力して、暗号リストに「えけ」と追加されること、「ぺんぎん」と入力して、暗号リストに「いぐごぐ」と追加されることが確認できればOKだよ。 今回はリストを使いこなすので、リストどうしが重ならないようにリストの場所を整えておこう。 さあ!ここまで、みんなの画面でもやってみよう!
鍵の分だけずらし、リストに対応しない場合の処理に注意しよう!
解読方法は生成方法の逆になるね
このチャプターでは、暗号を解読する処理を作っていくね。
暗号をつくるときの逆の処理だから、暗号化のときにつくった処理を複製して変更していこう。
今回はopenのスプライトに処理をつくっていくよ。
変数「暗号文」をつくろう。 値は、暗号文として入力された文字列だよ。 さらに、暗号文を解読した文字列を格納するリスト「平文リスト」をつくろう!
順番に変更していくね。 まずは繰り返し処理の前までを変更していくよ。 暗号文と平文に関係する部分は全て入れ替えよう。 質問文は「暗号にしたい言葉は?」から「解読したい言葉は?」に変更しよう。
解読の処理の部分について変更していくね。 まず、暗号化の逆なので、[n]+鍵の部分は[n]-鍵とする必要があるね。 さらに、[n]-鍵(かぎ)が1より小さくなってしまった場合は、リスト「ひらがな」の最後部分から戻ればいいね。
つくったブロックを、それぞれすでにあるブロックの処理と入れ替えていこう。 ここまで完成したら、動作を確認してみよう。 グリーンフラッグをクリックして、openのスプライトをクリックしよう。
「えけ」と入力して、平文リストに「あか」と追加されること、「いぐごぐ」と入力して、平文リストに「ぺんぎん」と追加されることが確認できればOKだよ。 リストどうしが重ならないようにリストの場所を整えておこう。 さあ!ここまで、みんなの画面でもやってみよう!
繰り返し処理で暗号の解読候補をつくろう
このチャプターでは、シーザー暗号「ろすをさきべしねきんへ」を解読することにチャレンジするね。 シーザー暗号であることは分かっているとしよう。 鍵が分からないので、鍵を1つずつ、合計70回繰り返せば解けそうだね。 これをコンピューターをつかって一瞬で解いてしまおう。
解読処理をリスト「ひらがな」の長さ回だけ繰り返せばいいので、openのこのスプライトをクリックしたときのかたまりを複製しよう。
今回はこのAttackerに処理をつくっていくよ。 解読した結果をどんどん溜め込むリスト「解読候補」をつくってね。
まずは、追加で繰り返す処理をつくっていくね。 鍵を1ずつ変えながら、平文リストを解読候補に追加し、追加が終われば平文リストをリセットする処理となるね。
処理が完成したら、[x]を1にするの部分をドラッグして、つくったブロックに組みこもう。
さらに、鍵は3ではなく1に変更しよう。
これで、解読処理を71回繰り返した結果をリスト「解読候補」に追加していく処理ができたよ。 最後に解読候補を初期化する処理を加えておこう。 ここまで完成したら、動作を確認してみよう。
解読候補が次々と追加されていくので、まずは、リストの位置を整えてね。 次に、Shiftボタンを押しながら、グリーンフラッグをクリックして、ターボモードにして確認しよう。 Attackerのスプライトをクリックして、「ろすをさきべしねきんへ」と入力してみよう。 解読候補に71の文字列が入力されいることを確認してね。
上から順に解読候補の文字列をみて、意味の通じるものはあるかな? 5番目に、意味が通じる解読文が表示されていればOKだよ。 ここまで、みんなの画面でもやってみよう!
鍵を1つずつずらしながら全ての場合について調べて解読しよう!
最後に、このレッスンで学習したことをおさらいしてみよう。 このレッスンでは、シーザー暗号について仕組みを理解して、プログラミングで暗号を生成したり、解読したりすることができたね。 おさらいしておこう。
入力した値とリストの内容を照合する処理は、入力した値に対して、リストを上から順に一致するまで繰り返すという処理だったね。 鍵を使ってずらしたとき、リストの長さを超えてしまう場合を、[もし~でなければ]で制御することも慣れてきたんじゃないかな。
さらに、暗号の解読には鍵が必要だけど、シーザー暗号だと分かっていれば、その解読はコンピューターの力を借りれば比較的簡単にできてしまうことが分かったね。 暗号は、情報を秘密でやりとりするという目的があるね。 発信する人、受信する人が安全にやりとりできるように昔から色々な仕組みが考えられているんだ。コンピューターを使っても解読に何十年もかかるような仕組みがあったりするので、興味のある人はどんどん学んでみよう!