ヤマダイスキーの旅日記

アウトドア全般、海外移住、資格試験、ウェブ開発などの話をします

ルービックキューブで暗号は作れるか

ふと、友人と宝探しでもしてみようかな、と思った。

 

このご時世でも、別々の場所で直接会わずに謎解きをするならば文句は言われまい。

 

宝探しには地図が必要であり、地図はせっかくならば暗号で書かれていたほうがよかろう。

 

暗号も、せっかくだから文字や数式なんかじゃつまらない。そう、ルービックキューブで暗号を作ってみようと思った。

 

 

だってこれを見たまえ。

 

 

f:id:wonderfulsolution:20200510194020j:plain

 

 

「昨日の2時3分、雨上がりに空中浮遊してたら、壁の買ってきたクロワッサンをTシャツで遠くまで踏みつぶしちゃって、もう彼には頼めないだろう」

 

ぐらいの文字列が埋め込まれていてもおかしくない雰囲気じゃないか。

 

 

 

調べてみると、ルービックキューブはおよそ「4.33×10^18」通りの組み合わせが可能らしい。

ルービックキューブ 組み合わせ数 計算方法 - Let's have a hobby!

 

 

4325京。

 

 

「は?」と思ったので、試しに

 

「1回も同じにならないよう注意しながら、毎秒4.33回のペースで回転させる」

 

という想定で計算してみた。

 

 

すなわち、4.33×10^18 を

 

4.33×60(秒→分)×60(分→時間)×24(時間→日)×365(日→年)

 

で割る。すると、出てきた答えは

 

31,709,791,984 年

 

すなわち、317億年ですべての組み合わせを網羅できるようだ。

 

 

 

は?

 

 

 

さらには部品を取り外して別の場所に戻すのもオッケーにしたら、これの12倍の組み合わせになるそうな。

 

 

そんな小宇宙みたいなオモチャなのである、こいつは。

 

 

 

さて、どんな暗号を作ったろう。

 

 

 

まず最初に参考にしたのは、点字

 

f:id:wonderfulsolution:20200510194618j:plain

点字 | 点字について | 社会福祉法人 名古屋ライトハウス

 

 

縦の1列は白のまま。1つの面に2文字を含め、1文字目は赤、2文字目は緑。重なっている部分はオレンジを使う。

 

(3文字目を含めるケースも考えてみたが、法則がごちゃごちゃになるので説明は省く)

 

たとえばこれは「サッ」と「ホロ」ということ。半濁音も入れれるけど今回は省いた。

 

 

f:id:wonderfulsolution:20200510200116j:plain

 

f:id:wonderfulsolution:20200510200312j:plain

 

しかし、せっかく6つの色・3つの列・3つの段があるのに、たった2文字のカタカナしか含められないのはもったいない。また「1文字目は赤、2文字目は緑」などという色の使い方は、あくまで作成者の恣意的な順序付けにすぎない。そもそも、点字を参考にするなら一覧表を見ながら作成・解読しないといけない。

 

 

モールス信号も同じようなもので、どうしても情報の密度が低くなる。そして長々としたルール説明も必要になる。

 

 

 

次に思いついたのはハングル。しかしこれも、すべての日本人がパッと判読できるわけではない。ハングルを参考に独自の文字体系を作ることもできるが、それもまた作成者の甘えである。

 

 

アラビア語もそう。皆さんご存じのように、アラビア語では子音しか表記されていない。日本語でいう漢字のルビみたいに、例外としてコーランや児童向けの絵本なんかに母音記号が書いてあるだけである。アラビア語みたいに子音記号だけをルービックキューブで表そうと思ったが、これまた順番が恣意的になってしまうのでよくない。

 

 

 

 

 

やはり使うなら五十音表だろうか。

 

 

ということで、時計回りに「ア行、カ行、サ行、タ行、ナ行、ハ行、マ行、ラ行」と振って、色をそれぞれ「赤はa、緑はi、オレンジはu、青はe、黄色はo」としてみた。

 

また残った「ヤ、ユ、ヨ、ワ、ン」と「濁音・半濁音」をセンターキューブの役割にする。(ヲや長音記号や拗音は除いた)

 

例えば

 

f:id:wonderfulsolution:20200510200642j:plain

これは「ガ」。

 

f:id:wonderfulsolution:20200510200854j:plain

これは「モ」。

パピプペポとバビブベボの区別はできないが、そのくらいはしゃあない。

 

ヤユヨとかごちゃごちゃした説明も、ここでは省く。正直なんだっていい。 

 

 

これなら判読が簡単だ。

 

しかし、やはり情報密度の低さが気になる。さっきの点字を使ったやつのほうがよい。というか普通にカタカナで紙に書いたほうがよい。(暗号とは)

 

 

 

そもそも、色というものに万人が納得できる大小関係や順番や意味がないのが問題なのである。

 

 

 

うーーん、といろいろ考えてみたが、それなりに作成しやすく解読の難易度も適切な、ちょうどいい打開策が浮かばない。

 

 

 

ルービックキューブ 暗号」でググってみたが、1つもヒットしない。

 

 

“rubic’s cube encryption”でググってみたが、「各パーツに紙を貼って文字を書き込み、バラすことで暗号化する」という、ちょっと趣旨の違うことが出てきた。

A Rubik’s Cube encryption challenge – Klausis Krypto Kolumne

 

その暗号化が数学的にどれほどの強度なのか、というので学位論文を書いた人もいるらしい。これが学部生なのか大学院生なのかは不明。

https://epublications.regis.edu/cgi/viewcontent.cgi?article=1511&context=theses

 

 

ただし、僕がやりたいのは、自然言語をキューブの色の組み合わせとして「翻訳」する方法であって、キューブ本体に紙を貼り付けて「保存」することではない。 

 

 

 

 

うーん、いっそ表音文字をやめて、表意文字にでもしてみるか?

白をすべての始まり、赤をすべての終わりにして、その経路を物語にするとか?

 

 

うむむ、それでは解釈の幅がありすぎる。オレンジとか何やねん。

 

 

 

 

ここまでの問題点を簡単にまとめると、「情報密度が低く、翻訳したあとの分量が増える」ということである。せっかくの宝探しの地図に、ルービックキューブの面が10も20も並んでいるのは萎える。せめて3つくらいにしたい。

 

 

 

ということは、そもそも翻訳する情報を絞ればよさそうである。

 

 

 

そう、「緯度・経度・部屋番号」の3つであれば、すべて数字で済むから短くなりそうだ。

 

 

 

ということで、試しにグーグルマップを開いて京都の鴨川デルタの緯度・経度を調べてみた。

 

35°01'47.3"N 135°46'18.4"E

 

だそうな。

 

 

ちゃんと「鴨川デルタ」と書いてあるし、さらには「24時間営業」になっているあたり、グーグルは偉い。

 

 

まぁよい。35.01473 と 135.46184 なんだが、日本国内なら経度は下2ケタにしてもいいだろう。

 

あとは有効数字だが、だいたい日本付近で緯度・経度の1度は91kmくらいである。(赤道付近なら111km)。だから小数第4位が1違うと、実際には9.1mの誤差となる。これだとちょっと大きいのでやはり小数第5位まで使うことにする。

 

 

では、この7ケタの数字をキューブでどうにか表現していこう。

 

 

f:id:wonderfulsolution:20200510202452j:plain

 

 

まずは6つの色について、白(W)を0、赤(R)を1、緑(G)を2、オレンジ(O)を3、青(B)を4、黄(Y)を5、ということにする。0~5しかないので6進法ということになる。

 

また、数字を当てはめる順番も、上段の左から右、中段の左から右、そして下段の左から右、とする。

 

この2点については決めてしまうしかない。

 

 

さて、経度の 3,501,473 (10) を6進法に直すと、203,014,305 (6) になる。

同様に緯度の 3,546,184 (10) を6進法に直すと、204,001,304 (6) になる。

 

 

わざわざ計算するのかぁ面倒だなぁと思ったら、こんな便利な電卓があった。宝の地図にあるまじき計算ミスも、これで防げる。

進数(基数)変換機 - instant tools

 

なお、9ケタまでの6進法だと 6^9-1=10,077,695 (10) までしか表記できない。東経の百の位を削ったのはそのためである。

 

 

 

鴨川デルタだから、部屋番号とかはよいだろう。

 

 

 

つまり、あそこの位置情報をルービックキューブで表現するなら

 

f:id:wonderfulsolution:20200510202834j:plain

これが東経で

 

f:id:wonderfulsolution:20200510203025j:plain

これが北緯、ということになる。

 

 

 

 

やったぁ

 

 

 

 

最初のデータが近いこともあって、けっこう似るものである。

 

 

 

 

まぁ暗号化できたとはいえ、そもそも隠す宝をどうすんねんっていう話ではある。

 

むしろその方が大事だったりする。

 

 


ってか、これ宝が隠してある場所を示すというより、自分でぐちゃぐちゃに崩したルービックキューブが指し示した場所に行かないといけない、とかいう使い方のほうが正しい気がする。

 

 

 

 

 

 

 

 

 

罰ゲームでやるかぁ