見出し画像

暗号文を作ったので解説する

はじめに

会社から名古屋大学の学生を対象にした暗号を作成する依頼を受けました。
この暗号はオンラインで出題され、正解者の中から抽選で数名にTシャツが当たるイベントとして、現在第二回が絶賛開催中です。

今回は第二回の宣伝を兼ねて、第一回の解説記事を執筆することにしました。
自分で解きたい!という方は先に以下のリンクから挑戦してみてください。

この記事はAcompany Advent Calendar 2024の9日目の記事となります。

暗号の解説

今回出題した以下の暗号文について解説を行います。

velgsrfidxnbwomoxslyedagzzzzzzzzubngyq

特に難しい知識を必要とせず誰でも読めるように心がけていますが、暗号に興味のない方は読み飛ばしていただいても構いません。

平文について

説明の都合上、まず今回の平文(暗号化される前の文)について解説します。

今回は平文として以下を選びました。

What is the Acompany Value of Acompany vector

Acompany vector は弊社が掲げる「会社の方向性」を示す言葉です。
詳細は以下のカルチャーデックから確認できます。


この Acompany vector の一つに「Acompany で共有する価値観」を意味する Value があり、その内容「Be Cool. Be Hacker.」(を暗号化した"abnbyknfgxnxoq")が今回の答えとなります。

ヴィジュネル暗号

今回の暗号はヴィジュネル暗号という技術を用い、弊社の社名 “acompany” を鍵として作成しました。

ヴィジュネル暗号では、まず鍵となる文字列を作り、その各文字を a→1, b→2, …, z→26 のように数値に変換します。
今回の鍵 “acompany” はこれにより 1, 3, 15, 13, 16, 1, 14, 25 の8つの数値に変換されます。(これを鍵数列と呼ぶことにします)

鍵から鍵数列への変換

この数値列を用いて平文を暗号化します。
事前準備として、平文の空白(スペース)をすべて削除し、大文字は小文字に変換しておきます。(whatistheacompanyvalueofacompanyvector)

まず鍵数列の一つ目は 1 なので、平文の先頭の文字 w を 1 ずらして v にします。(アルファベット順で w の一つ前が v です)
次に鍵数列の二つ目は 3 なので、平文の2文字目 h を 3 ずらして e にします。
同様にして平文の3文字目を 15, 4文字目を 13, 5文字目を 16, … とずらしていきます。
数値列の長さが8なので、9文字目になると数値列は先頭に戻り、9文字目を1, 10文字目を3, 11文字目を15, … とずらします。

平文を暗号化する手法

こうしてすべての平文をずらして出来上がったのが以下の暗号文です。

velgsrfidxnbwomoxslyedagzzzzzzzzubngyq

逆に暗号文から平文を復号したい場合は、鍵数列 1, 3, 15, 13, 16, 1, 14, 25 を用いて暗号化とは逆向きに各文字をずらせばよいです。

想定していた解き方

暗号文を再掲します。

velgsrfidxnbwomoxslyedagzzzzzzzzubngyq

この文から参加者がどのように答えを導く想定であったかについて簡単に書いておきます。

ノーヒントの場合

最初に断っておくと、ヒント無しでこの問題を解くのは非常に難しいはずです。
「ヒント無しでも全く不可能というわけではないが、ヒントをすべて見てもなおかなり難しい問題」となるように作成したつもりですので、ノーヒントで解けた方がもしいれば相当な天才だと思います。

まず暗号文を見て真っ先に思うのは、不自然に連続した8個の z でしょう。ここでヴィジュネル暗号を知っていて、なおかつ非常に勘の良い方であれば「これは8文字の鍵でヴィジュネル暗号を行い、鍵自身を暗号化したものではないか」と思いつく可能性があります。

さらにそこから「8文字の言葉と言えば、この暗号ページを提供している会社の名前が acompany だったな」と追加で閃くことができれば、解くことができると思います。

が、先述の通りこれは相当に難しいので、解読の道筋になるような三つのヒントを作成しました。

ヒント1の意図

もし暗号文に空白区切りを入れるとすれば適切な区切りは以下になります
velg sr fid xnbwomox slyed ag zzzzzzzz ubngyq

ヒント1

まず暗号文に不規則的に区切りを入れられることがヒントです。
例えば以下のように、平文を3文字ずつ読むような暗号文の場合、区切るとしたら5文字ごとに区切るしかありません。

acompany is great を aagcn royem iapst に変換する暗号

それに対しヒントでは不規則に4文字・2文字・3文字・・・と区切られています。
ここから「英文の各文字を変換する(換字式暗号の)系統」とアテを付けることができるというのがこのヒントの意図でした。

このヒントだけでは換字式と確定させることは難しいですが、無限の択からいくばくか候補を減らす材料になると思います。

ヒント2の意図

The letter of challenge from Acompany
を同様の方式で暗号化すると以下のようになります
sepyosffqlqprzxmdkrrpqanzzzzzzzz

ヒント2

ヒント2からは以下の2点が成立するという予想が立ちます。

  • 平文と暗号文の長さは同じ

  • 暗号文の zzzzzzzz は Acompany が変換されたもの

賢い人・暗号の知識がある人はここから「暗号化の方法に Acompany という文字列が関係しているのでは?」という考えに辿り着くだろうというのがこのヒントの意図になります。

ヒント3の意図

A letter of challenge from Acompany
を同様の方式で暗号化すると以下のようになります
zipgdddpezsnvkqofbqeylmdnjanxx

ヒント3

ヒント3からは、Acompany が常に zzzzzzzz に変換されるわけではないことが分かります。
ヒント2と比較して、文字数などに意識を向けてもらう意図でした。

暗号の制作過程について

暗号の制作過程についても書きます。
この記事を書く目的の多くはここで、社内外に「こんなに色々考えて作ってたんだぞ」というのをアピールするために筆を握っています。
ここで触れる考え方やアイデアは今後暗号や謎解きなどを作る人にも参考になるかもしれません。

暗号手法の選定

問題を作ること自体は多少経験もあるため言葉遊びをテーマにした謎解きは簡単に作成可能ですが、それでは弊社の独自性がありません。
プライバシーテックの企業として出題するからには一般に「謎解き」ではなく「暗号」とカテゴライズされる問題を作らなくてはならない、と考えて作問を始めました。

そうして5分ほどの熟考の末、既存の名高い暗号をつかうことでこの問題を解決することにしたのですが、名高い暗号は実用的であるがゆえに知識がないと自力で解くのは難しいです。

そこで今回は平文に鍵と同じ単語を含めるというある種の脆弱性をあえて用いることで暗号化手法および鍵の長さを推測できるという独自の解法を提供しました。
さらにヒントからも鍵が分かるようにし、なんとか問題として成立するラインになったかなと思います。

回答方法について

参加者が自分の回答の正誤が分かるように自動採点機能をつけることにしたのですが、そこで直面する課題の一つが表記揺れです。
英語であれば、大文字小文字の揺れや、スペース、ピリオドの有無などが問題となります。

もちろん「答えは14文字です」「英語小文字で答えてください」「スペースやピリオドは入れないでください」のように注意書きをたくさんつければある程度解決するのですが、あまり注意書きまみれにするのも見栄えが悪いような気がして、なんとなく抵抗がありました。

そこで今回は、答えの文字数の指定に加えて「答えの文字列を暗号化してから回答する」という方法を採用しました。

参加者は問題文やヒントから「暗号化の際は平文を全て小文字に変換し、スペースなどを取り除く」というルールを理解することができるため、暗号化の過程で自然と表記揺れのない回答に変換されるようになります。
これはそれなりにおしゃれな解決策だったと思っていますが、一方で参加者に余計な手間をかけさせてしまったと少し反省もしています。

平文・解答の選定

平文および解答も適当に選んだわけではなく、いくつもの制約がありました。

平文の制約

  • 解答が一意になる

  • 文字列に Acompany を含む(暗号手法との兼ね合い)

  • Acompanyの前に書いてある文字数は8の倍数(暗号手法との兼ね合い)

  • 長すぎない

解答の制約

  • 会社に関わる内容(会社の宣伝になるので)

  • 一意な英語表記がある

  • 長すぎない

これらの制約を全て満たすような文字列を頑張って探した結果、前述の平文が出来上がりました。
特に文字数周りで細かい調整をする必要があったのですが、最終的にはそれなりに無理のない文章になったと思います。(英語苦手なので文法などで不備があるかもしれませんが…)

終わりに

今回の記事で伝えたかったのは

  • 暗号や数学の知識がなくても解けるように作っているよ

  • 実は細かいところまで色々考えて作っているよ

の2点でした。
第二回も同じように作っているので、ぜひ挑戦してみてください。
1人での参加だけでなく家族や友人と協力して解いても楽しいと思います。

この記事を書いている時点だとまだあまり解かれておらず、 まだTシャツの当選確率が50%くらいあります。

いいなと思ったら応援しよう!