見出し画像

暗号解読の手段:エンコード・デコード

エンコード・デコードとは

エンコード(符号化)とはデータを一定の法則で符号に変換することであり、デコードとはそれを元のデータに戻すことである。符号の種類は、古くはモールス符号、コンピューター上ではASCII、Base64、uuencodeなど、その例はさまざまである。これらは通信に便利なように作られたものであるが、データの秘匿を目的としているわけではない。つまりこれらの符号によりエンコードされたデータは、正確には暗号文ではない。しかしそのままでは読むことができず、知識がなければ本来の意味あるデータを得ることができないという点で、暗号と通じる部分がある。

謎解き・暗号解読における用例

謎解きにおいては、ある方式でエンコードし、別の方式でデコードを行い、結果意味が理解できなくなったテキストを出題してくる場合がある。これは変換の手順を見極め、変換を元に戻して意味あるテキストを得ることが出来る。

現代暗号はビット列を扱ったり(DESなど)、数字を扱ったり(RSA暗号など)するものがある。これらの暗号は文字列を直接暗号化できないので、任意の方法でエンコードし、それらの暗号が扱えるビット列や数字に変換する必要がある。

モールス符号

モールス符号とは長点と短点からなる文字コードである。アメリカ人の発明家サミュエル・モールスが発明した。発明時点から時間をかけて改良されていき、1868年には現在のものの原型が規格化された。その後も文字の追加(例えば2004年には@に当たる符号が制定された)といった些細な改変を経て今に至る。

ウィキペディア記事「モールス符号」

dcode.fr内のモールス符号変換ツール

符号化方式

長さを変えた符号(長点と短点)を用いて文字を符号化する。符号の形式は音響、光など、長点と短点を表現できるならば何でもよい。
短点(・)は日本語では「トン」、英語では「dit」、長点(-)は日本語で「ツー」、英語では「dah」と表現することが多い。
モールス符号の例を示す。

「example message」のモールス符号変換
・ -・・- ・- -- ・--・ ・-・・ ・ 
-- ・ ・・・ ・・・ ・- --・ ・

特徴

・長点・短点からなる単純な符号であるため、それら(及び場合によっては空白)を、別の記号や言葉に置き換えた変種はいくらでも作り出せる。2、3種類の記号や文字からなるテキストは、モールス符号を表現しているかもしれない。
・モールス符号は謎解きではしばしば出てくる。身に着けた方がいいとまでとは言わないが、頭の片隅に置いておいて損はない。

ASCII

ASCII(情報交換用米国標準コード、American Standard Code for Information Interchange)とは、7桁の二進法で表現できる整数(0~127)の数値の一部に、大小のアルファベット、数字、記号を割り当てた文字コード。1963年制定。

ウィキペディア記事「ASCII」

dcode.fr内のASCII変換ツール

符号化方式

0~31(十六進:00~1F)および127(十六進:7F)には制御文字(通信制御や周辺機器の制御などに用いる特殊な文字)に、印字可能な文字は32~126(十六進:20~7E)に当てはめられている。
ASCIIの例を示す。

「example message」のASCII変換
・101 120 97 109 112 108 101 32 109 101 115 115 97 103 101 (十進法)
・65 78 61 6D 70 6C 65 20 6D 65 73 73 61 67 65 (十六進法)
・01100101 01111000 01100001 01101101 01110000 01101100 01100101 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101 (二進法)

特徴

・数字を文字に、文字を数字に変換する方法としては代表的なものと思われる。
・ASCIIは謎解きでしばしば出てくる。ただし、暗号化したビット列や数字をASCIIで文字に変換することはあまり行われない。そうしようとすると、高い確率で印字不可能な制御文字に行き当たってしまい、扱いに困るからだろう。

Base64

Base64とは、データを64種類の印字可能な英数字・記号を用いて表現するエンコード方式。基本的には大小アルファベット(52種類)、数字(10種類)、+と/の計64種類を用いるが、パディング(余った部分を詰める)記号として=も用いられ、また76文字ごとに改行コードも挿入される。

ウィキペディア記事「Base64」

dcode.fr内のBase64変換ツール

符号化方式

1、元データを6ビットごとに区切る。6ビットに満たない場合は0を補う。
2、各6ビットを変換表に従って4文字ずつ変換する。4文字に満たない場合は=を補う。
データをBase64で変換する例を示す。

元データ
「example message」

ASCIIでエンコードする。
「01100101 01111000 01100001 01101101 01110000 01101100 01100101 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101」

6ビットごとに区切り直す。
「011001 010111 100001 100001 011011 010111 000001 101100 011001 010010 000001 101101 011001 010111 001101 110011 011000 010110 011101 100101」

各6ビットを変換表に従って文字に変換し4文字ごとに区切る。
「ZXhh bXBs ZSBt ZXNz YWdl」

連結する。
「ZXhhbXBsZSBtZXNzYWdl」

特徴

・謎解きにおいては、「文字を直接Base64でエンコードする」よりも、「他の形式(ASCIIなど)でエンコードされたデータをBase64で文字列に変換し、それを出題する」という使い方を見かける。
・末尾に=がついている文字列があれば、Base64の可能性がある。

uuencode

Base64と似ているが、こちらは小文字のアルファベットを用いず、記号を用いる。

ウィキペディア記事「uuencode」

dcode.fr内のuuencode変換ツール

符号化方式

1、元データを3オクテット(1オクテット=8ビットなので24ビット)ごとに区切る。これを4つの6ビット値に変換する。
2、各6ビットを変換表に従って変換する。
3、通常45オクテットごとに改行する。
4、各行頭にその行に含まれるオクテット数を示す文字を付ける(通常は45オクテットなのでMを付け、それに満たない行には別の文字を付ける)。
5、改行し`のみの行を書く。これはデータの終了を意味する。
6、ヘッダーとフッターを付ける。

元のデータ
「example message」

ASCIIでエンコードする。
「01100101 01111000 01100001 01101101 01110000 01101100 01100101 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101」

6ビットごとに区切り直す。
「011001 010111 100001 100001 011011 010111 000001 101100 011001 010010 000001 101101 011001 010111 001101 110011 011000 010110 011101 100101」

各6ビットを変換表に従って文字・記号に変換する。
「97AA;7!L92!M97-S86=E」

行頭に、行に含まれるオクテットの数を表す文字を付ける。今回は15オクテットなので、変換表により/を付ける。また改行して`のみの行を書く。
「/97AA;7!L92!M97-S86=E
`」

ヘッダーとフッターを付ける。
「begin 644 dcode_uuencode
/97AA;7!L92!M97-S86=E
`

end」

特徴

・ビット列を文字列に置き換える方法の一つ。筆者はDES暗号やRSA暗号がこのuuencode(と思われる)方式で出題されているのを見たことがある。
・uuencodeにより変換されたデータは、ヘッダーとフッターから成る一定のフォーマットを持っている。
・長いデータを変換すると、Mから始まる行がずらっと並ぶことになる。行の先頭はその行に含まれるオクテットの数を示しており、通常はそれが45でなので、それに対応するMが書かれるからである。このように、Mから始まる行がひたすら続くテキストがあった場合はuuencodeにより変換された文章と考えられる。

まとめ

・エンコード・デコード自体は暗号化ではないが、暗号と密接な関りがある。
・謎解きにおいてはASCIIでエンコードされたデータをBase64などで変換し出題する、などといったことが行われている。それを復元するには、各符号化方式の持つ特徴に注目するのが有効である。

次の記事

未定。

この記事が気に入ったらサポートをしてみませんか?