NSAのパズルでシギントデビューしよう。クリスマスは正規表現を。 <自由部門>

第一回プラチナブロガーコンテスト


まずは昨日のタンブラーの投稿から。


イギリスからはるばるアメリカNational Security Agencyのパズルが回ってきた(笑)。今開催中(?)のものなのでシェア。

NSA CRYPTO CHALLENGE Puzzle of the week
https://www.facebook.com/NSACareers/app/1541913382708799/

Tips:
Look for single-letter words, double letters within words, and apostrophes.
Look for common words (e.g., the, an, that).
The more you play, the more certain trends will become apparent.

f0337316_16535700.png

NSAのヒントの通り。1文字のものや、同じ文字が重なる単語などに注目する。

初歩的な換字式暗号なので、シギントデビューしたい人にオススメ。答えはNSAに代わって(笑)私が明日ココに掲載。

※Puzzle not accessible from mobile devices.と書いてある。


 ココから下は答えと解き方なので、まずは自分でパズルに挑戦したいという人はご注意を。

f0337316_16525891.png

 答え:THE JOINT NSA-DIA PROJECT COINS GAVE INTELLIGENCE CUSTOMERS DIRECT ACCESS TO ELECTRONIC SIGINT - A FIRST STEP TOWARD A COMPREHENSIVE INFORMATION SHARING NETWORK.

 解説:R=T、N=Jといった具合に、1対1で置換されている。エニグマのように連続する「AA」が(例えば)「QC」とか(ローター式)になったりはしないので、基本的な換字式暗号だ。

 解き方。

 多分英語だろうと考えると、文章の書き始めの最初の3文字(「RUL」の部分)と言えば「the」とかそういう単語だと推測するところから始まる。

 「O」が2箇所単体で出てくるので、英文的に「a」だろうことは想像に難くない。

 そして2行目の「OMMLHH」のように2,3文字目が同じ文字、5,6文字目が同じ文字という特徴的な文字列を考える。例えば「voodoo」は近いが、原文の「MM」と「HH」は異なる文字が変換されているはずだから違うと考える。「access」が合致する。

 そうして当てはめていくといつかは解けるようになっているんだが、時間もかかるしこういう時代だしということで、プログラマーなら正規表現で辞書検索する(正規表現が使える辞書サイトのサンプル)。

 正規表現とは、「アルファベット6文字で、最初がaで4文字目がeで最後がsの単語」のように、一部分や文字数しかわからない場合に、文字列を「規則性」で表現するために用いられる。こういった探し方を「パターンマッチ検索」と言う。

 ※正規表現はPHPとかJavaとか言語が異なってもほぼ同じなので、一度覚えたら使い回しができるから積極的に向き合うことをオススメする。

 「6文字の英数字」を正規表現で書き表すと、

^\w\w\w\w\w\w$

など(方法は1つじゃない)がある。
 「\w」は小文字・大文字を問わない英数字(「_」を含む)1文字を表し、先頭の「^」は文字列の始まり、最後の「$」は文字列の終わりを指す。

 これだと6文字の英単語が全て該当するので、

^\w(.)\1\w(.)\2$

とする。「(.)」は「ある任意かつ特定の1文字」という意味で(後方参照、「キャプチャ」「サブパターン」を参照)、「\1」はいくつでも使え、左から順番に指定できる。この場合2回「(.)」を使っているから、「\1」は1回目の該当文字「M」、「\2」は2回目の該当文字「H」となり、「OMMLHH」のパターンにマッチする。

 文字数の多い単語はより特定しやすいので、2行目の「JKRLPPJBLKML」に目を向ける。12文字だから、

^\w\w\w\w\w\w\w\w\w\w\w\w$

であり、1文字目と7文字目が同じ、2文字目と10文字目が同じ、5文字目と6文字目が同じ、4,9,12文字目が同じだから(極めて特徴的な文字列だ)、

^(.)(.)\w(.)(.)\4\1\w\3\2\w\3$

後方参照を使い表してみる。
 該当する英単語は「intelligence」であり「諜報」を意味する。

^(\w)(\w)\w(\w)(\w)\4\1\w\3\2\w\3$

と書いてもイイ。「.」は「ある任意の1文字」だから記号なども当てはまるので、「\w」とすれば「英数字」1文字と指定できる。

^([a-z])([a-z])[a-z]([a-z])([a-z])\4\1[a-z]\3\2[a-z]\3$

でもイイ。「[a-z]」はアルファベット小文字の1文字を意味するので「\w」よりももっと絞り込める。「[A-Z]」なら大文字。検索対象の辞書がどちらかわからない場合は「[a-zA-Z]」(小文字・大文字両方)と指定する。

 正規表現にはいろんな表現技法があるため、何が正解というよりも、見てわかりやすい方がイイ。

^\w{6}$

とすれば「英数字6文字」という意味になる(「{6}」は6回繰り返し)が、今は「何でもいいから6文字の英数字」を探しているわけではないので、目的に対し順を追って説明する際に適した表現を選びたい。

 最初と最後の「^」「$」がある・なしの違い。

^abcdefg$

とした場合、「abcdefg」そのものに該当するが、

abcdefg

とだけ指定すると、「xyzabcdefghij」のように「abcdefg」が“含まれる”文字列も該当する。パズルのように文字数が予めわかっている場合は、最初と最後を明示した方が余計な文字列がヒットせずにより絞り込める。

 私はどうやって解いたかというと、最初に「JKRLPPJBLKML」から手を付けた。「OMMLHH」から解こうと思い正規表現が使える辞書サイトを探している最中に、ふと、

JKRLPPJBLKML
123455164274

と数字に置き換えてgoogle検索したところ、1件だけ該当した(笑)。世界は広い。同じ概念の人がいて、英語の辞書を数字に置き換えてアップロードしているサイトだった。クリプト(暗号)クラック系のよう。早い話レインボーアタックの下準備サイトみたいなものだが(笑)、googleでたった1件、しかも該当が「intelligence」の1単語のみというのが何とも素敵すぎる。

 その場の思いつきだが、基本は正規表現と同じ考え方で、♪をドレミファと読むように符号化してみた。「123455164274」を見れば、5,6番目が同じ文字だとか、7種類の文字を使い全部で12文字ということがわかる。サイトの主は私と同じ音系かもしれない。

 クロスワードと同じく、長い文字列が解けると一気に埋まるので、他が楽になる。

 というわけで、これが解けてもNSAにもCIAにも全くお呼びでないレベルだが、暗号解読の基礎としてとても良いクイズだと思う。正規表現の使い所としても楽しいのでプログラミング学習教材にも使える。

 そんなわけでクリスマスイブは暗号解読で2人の距離を縮めましょうemoticon-0122-itwasntme.gif
 メリークリプトス!emoticon-0123-party.gifemoticon-0168-drink.gif

チャーリー(
JAPAN MENSA会員

AEAJアロマテラピー検定1級
AEAJ認定アロマテラピーアドバイザー
AEAJ認定環境カオリスタ
AEAJ認定アロマテラピーインストラクター
AEAJ認定アロマブレンドデザイナー
AEAJ個人正会員
JAMHAメディカルハーブ検定1級
JAMHA認定メディカルハーブコーディネーター
JAMHAハーバルセラピスト試験合格
ITパスポート試験合格(笑)。
情報セキュリティマネジメント試験合格
臭気判定士試験合格

チャーリーのタンブラー(毎日更新、日記・ブックマーク的な)


by charlie-ls | 2016-12-24 17:09 | 個人ブログ | Comments(0)

カメラマン☆チャーリーのブログ


by チャーリー
カレンダー
S M T W T F S
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