(1)なぜBASE64が必要?
メールはもともと7bitのASCII文字で送受信されることを想定していました。なので、日本語文字やら画像は送れません。
ネットワークスペシャリストを目指す女性SEあれ? 

いや、添付ファイルに画像をつけて送ることができますよ
はい、ただし、一工夫しています。そのままではバイナリデータを送れないので、Base64というエンコードを用い、文字列に変換して送っています。

(2)BASE64の概要
BASE64では、全てのデータを64個の文字(a-z、A-Z,0-9、+,/)で表す。
ネットワークスペシャリストを目指す女性SEハテナ 

なぜ64個? 
詳しく説明しますね。画像でも日本語でも、すべて01データです。それを変換してテキストデータにします。
やり方はいくつかありますが、BASE64では、英数を使おうとしたのです。
01データを6ビットずつに区切ります。。6ビットなので、000000〜111111の64パターン。だから、64個の文字があれば、すべてのビットパターンを表現できのです。
※厳密にはパディングの=があるので、65個です。パティングは、ちょうど6ビットに収まらなかった場合に=で詰め物をします。

また、暗号化ではありません。元に戻すことも簡単です。

(3)エンコードの実例
たとえば、Helloという文字を送る場合。
「Hello」は8ビット文字として以下のようにあらわされる。
Hello
01001000  ・・・H
01100101  ・・・e
01101100  ・・・l
01101100  ・・・l
01101111  ・・・o

ここで、6ビットに変換する。

010010 
000110 
010101 
101100 
011011 
000110 
1111   ←端数がでるので、最後は0埋めし、111100とする。

変換表に基づき、文字に変換する。

010010 S
000110 G
010101 V
101100 s
011011 b
000110 G
111100 8

SGVsbG8= となる。 ※=はパディング 
6ビットで区切り、8ビットの文字に変換するため、データは4/3倍に膨れ上がる。

(4)過去問
過去問(H18SV午後2問2)を紹介する。
S/MIMEを使用した場合,添付されるバイナリデータは,ASCIIで表現される64種類の文字と特殊用途の“="を使って表現する[ f ]方式に従って,テキストデータに変換される。64種類の情報を表現するために必要なビット数は,[ g ]ビットである。ここで, 1バイトが8ビットで,[ g ]と8の最小公倍数が[ h ]になり,[ h ]ビットは[ i ]バイトである。したがって,[ i ]バイトのバイナリデータから, 4バイトのテキストデータが生成される。 つまり,添付されるテキストデータは,パディング文字や改行文字などを無視すると,バイナリデータの[ j ]倍になる。このことから,調達ファイルのような大量のデータを転送する場合には注意が必要である。
正解は、以下。
f  BASE64
g  6
h  24
i  3
j  1.3 ※4/3を四捨五入。

もう一問。
【H18NW午前 問29】
30kバイトのJPEGファイルを電子メールに添付するとき、実際の転送データはおよそ何kバイトになるか。ここで、添付ファイルはMIME Base64を用いてエンコーディングされるものとする。

正解:40kバイト

(5)エンコードデコードのツール
以下のツールを使うと、Base64の変換などがWebで簡単にできる
https://gchq.github.io/CyberChef/
BASE64やハッシュ関数あたりが使えそう

また、rot13を使うと(検索から)、シーザー暗号を指定文字だけずらすことができる。
rot13(シーザー暗号)については、Linuxのコマンドtrでも可能。trの後半の文字列は、〇〇を△△に変換、などの意味だろうが、よくわかっていない。
# echo abc | tr 'n-za-mN-ZA-M' 'a-zA-Z'
nop ←abcを13文字ずらした文字になった。

ハッシュ関数などの演算処理は、opensslコマンドでも可能
ためしにBASE64でエンコードしてみよう
# echo -n abc | openssl base64
YwJj
※echoでパイプで渡している。-nが無いと、最後に改行コードが入ってしまう。

スポンサードリンク