學而時<span lang="ko">習</span>之 RSSフィード

學而時

20160209 Base64だけじゃない。「Base N」encodingをまとめてみる。

ZETT(ゼット) 野球 軟式 フトンベース (置き型式) ZBV11

はじめに

セキュリティの仕事をしていると、64以外のBaseNの符号化を目にすることがある。実はいくつものBaseNのエンコーディング手法が存在するのでまとめてみる。


どの数値で提案されているのかは、Wikipediaの英語版にまとめられている。https://en.wikipedia.org/wiki/List_of_numeral_systems



とにかく列挙してみる

Base16 encoding
0123456789ABCDEF

一般的な16進数の記法そのもの。RFC 4648で定義されている。


Base26 encoding(letters only)
ABCDEFGHIJKLMNOPQRSTUVWXYZ

小文字をつかっても良い。


Base32 encoding
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

適度にコンパクトで、判読性が高く、かつ発声もしやすいため、他の符号化に比べてバランスが良いとされる。RFC 4648で定義されている。

アルファベット側のIやOを除く手法も提案されている。

0123456789ABCDEFGHJKMNPQRSTVWXYZ

Base36 encoding(alphanumeric)
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Base52 encoding(full letters)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Base62から数字を除いたものだが、Base58やBase62に比べるとメリットがない。使用例を見つけられなかった。


Base58 encoding
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

数字の0と大文字のO、および大文字のIと小文字のLは区別がつきにくいため、Base62からこれらの4文字を除いて判読性を向上させたもの。URLの短縮サービスでしばしば用いられるほか、Bitcoinにも利用されている。


Base62 encoding (full alphanumeric)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

Base64は'+'と'/'およびパディングの'='を含むが、これらの記号はURIにはそのまま使えない。Base62は記号を使用しなのでURIフレンドリーである。JavaScriptの難読化にしばしば利用される。


Base64 encoding
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

7ビットしか扱えない電子メールにて広く用いられる。URLや正規表現のため、'+'と'/'を他の文字に置き換えるルールもある。


Base85 encoding(ASCII85)

AdobeのPostScriptやPDFファイルで利用されいている。


Base91 encoding
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"

Base64よりも多数の記号を利用するため、符号化後の圧縮率が高い。SECCON CTF 2013 オンライン予選で出題されたことがある。


Base92 encoding
Base94 encoding(printable ASCII characters)
Base95 encoding

この辺は使える記号の数が増えるだけの感じなので省略。



まとめ

それぞれの符号化手法のメリットは、次の4種類ぐらいに分類することができるので、自分が何らかの規格を策定するときは次のいずれを優先するかで選択すれば良いだろう。

  • Nが2の冪乗になる(2, 4, 8, 16, 32, 64)
  • アクセシビリティが高い(判読性や発声のしやすさ)
  • URIや正規表現に対してフレンドリーである(記号を使わない)
  • 符号化してもコンパクトである