前回の記事では「文字の五十音表での位置を指で表す通信」をご紹介いたしました。
指の本数なので視認性も高く、大胆な動きが少ないので秘匿性も高く、2進数に比べると最適ではないものの、五十音表を基盤にしているので、人間にとって分かりやすいため、通信速度も申し分なく、里得木が常用するほど実用性が高いです。
しかし、暗号化されていないので、通信方法がバレれば、他の人に会話内容が筒抜けになってしまわないかと心配で夜しか眠れなかった人も多いと思います。
なので、今回は通信内容を暗号化する方法をご紹介します。
有名な方法では、シーザー暗号(単一換字式暗号の一種)というものがあります。
これは、ひらがなをあらかじめ決めておいた文字数だけずらすというものです。
例えば、「ねこ」と送信したい場合、あらかじめ3文字あとにずらすと決めておくと、「ひす」となります。
仮に、「ひす」が傍受されたとしても、何文字ずらしているのかがばれなければ、復元することができません。
前回の記事で紹介したように数字化していた場合、「ねこ」は「(5,4),(2,5)」となります。
各文字の2つ目のところに3を足すと、「(5,7),(2,8)」となります。
そして、2つ目のところを5で割った商を1つ目のところに加え、余を2つ目のところに書くと、「(6,2),(3,3)」となります。
「(6,2),(3,3)」を日本語化すると、「ひす」となります。
なので、僕が開発した「文字の五十音表での位置を指で表す通信」と相性がいいです。
しかし、「ひす」、「ふせ」、「へそ」......と1文字ずつ変え続けていくと、「ねこ」という文字列が出ます。
今回の例の「ねこ」はたったの2文字の単語なので、「へそ」のように意味を持つ単語がいくつか出てきますが、長文になると、最長でも49回ずらせば意味を持つ文字列が発生し、ばれてしまいます。
そんなあなたには、単一換字式暗号(シーザー暗号もこの一種ではあるのですが、今回はそれ以外という理解でお願いします。)がおすすめです。
そもそも、単一換字式暗号の定義はある文字を別の文字や記号に変換させる暗号のことです。
なので、「あ」と「い」、「い」を「ろ」、「う」を「は」と重なりが出ないように気を付けながら、1文字ずつ対応させていけばいいのです。
この方法だと、50!通りもあるので、傍受されてしまっても復元することはできないでしょう。
しかし、頻度分析という手法を使えば、ばれてしまう恐れがあります。
これは、名前の通り、出てくる文字の頻度から何に何が対応しているのかを推測する手法です。
英語だと、e、t、aがよく使われていて、日本語だと、い、う、んがよく使われています。
しかも、送信者も受信者も結構大変なのでおすすめしません。
これでも、まだ、傍受されて会話内容がばれるのが嫌だという方にはワンタイムパッドという手法(正確には単一換字式暗号の運用法)があります。
ザックリ言うと、1文字目と2文字目で暗号化の方法が異なるというものです。
例えば、「ねこ」を暗号化するときに、1文字目は1文字ずらして2文字目は3文字ずらすとします。
すると、「のす」となります。
「のす」という文字列を傍受したとしても、絶対に復元できません。
せいぜい、2文字の言葉という情報を得られるくらいでしょう。
この方法には、当たり前ですが、めっちゃめんどくさいという欠点があります。
ということで、今回は3段階に分けて暗号について書いてみました。
実際問題、友人と会話するときに暗号化する必要がある人は少ないと思いますが、1文字ずらすとかはやってみても面白いです。
暗号について興味を持った人はぜひ、調べてみてください。
おまけ(前回の記事の通信方法の改良案)
英語が得意でしたら、(0,0)から(5,5)までの36種類に、アルファベット26種類と0から9までの数字10種類を割り当てるという方法もあります。
片手2回もしくは両手1回で1文字を表すことができるので、一定時間あたりの通信文字量は多いです。
しかし、アルファベットを5文字ずつ把握している人は少ないと思うので、慣れるまでは難しいと思います。