namdicul's blog

気ままに更新します. CTFと暗号理論について勉強中です.

BASE64の仕組み

今回はbase64というエンコード方式についてまとめます.

base64とは

base64とは, 64種類の印字可能な英数字(a-z, A-Z, 0-9, +, /)のみを用いて, マルチバイト文字やバイナリデータをエンコードする方式です. SMTPという電子メールを送信するときに使用されるプロトコルでは, ASCIIコードという7bitで表現される英数字しか送信することができなかったので, 画像データなどの添付データをそのまま送信することができませんでした. そのため, すべてのデータを英数字で表すMIME(Multipurpose Internet Mail Extensions)という規格が登場し、その中でbase64というデータの変換方法が定められました.

base64エンコードした結果, データ量は約4/3倍になります. MIMEの基準では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れるとデータ量は約137%となることがわかっています.

base64の仕組み

base64は以下のようにしてエンコードされます.

(1) 文字列をasciiコードに変換し, それを2進数表現する.

"ABCD" => "01000001 01000010 01000011 01000100"

(2) 6ビットずつに分割する.

"01000001 01000010 01000011 01000100" => "010000 010100 001001 000011 010001 00"

(3) 余ったビットは0でパディングする.
"010000 010100 001001 000011 010001 00" => "010000 010100 001001 000011 010001 000000"

(4) 以下の変換表(引用: https://ja.wikipedia.org/wiki/Base64)から, 印字可能文字に4文字ずつエンコードする.

"010000 010100 001001 000011 010001 000000" => "QUJD RA"

f:id:tomonori4565:20181110153152p:plain

(5) 余った分は=でパディング

"QUJD RA" => "QUJD RA=="

(6)完成.

"QUJD RA==" => QUJDRA==

実装

UNIXコマンドには標準でbase64エンコードとデコードが実装されています.

$ echo -n 'I am Hirata' | base64
SSBhbSBIaXJhdGE=
$  echo 'SSBhbSBIaXJhdGE=' | base64 -D
I am Hirata

気が向いたら, 自分でも実装してみます.