Base64 は表記法であって暗号ではない
Base64 は任意のバイト列を A-Z、a-z、0-9 と二つの記号だけで書き直します。三バイトが六ビットずつ四つに分かれ、それぞれ一文字になるので、出力は入力のおよそ三分の四の長さになります。最後の組が埋まらないときは等号で埋めます。
目的は、文字しか通さない経路でバイナリデータを運ぶことです。メールの添付、ページに直接埋め込む画像、HTTP ヘッダーに置く資格情報などがそれにあたります。途中のシステムが予期しないバイトを壊すのを防ぎます。
マルチバイト文字はまずUTF-8に変換してから符号化します。「日本」の2文字は6バイトなので、Base64では8文字になり、英字6文字と同じ長さです。出力の長さから元の文字数は確かにはわかりません。
符号化を安全対策と取り違えない
Base64 は誰でも即座に元に戻せます。パスワードやトークンを Base64 で保存しても隠したことにはならず、読みにくくなるだけで、ログやバックアップに届いた時点で完全に露出します。秘密にすべき値には暗号化かハッシュが要ります。
生の Base64 を URL に入れると壊れます。標準の文字集合が使うプラスとスラッシュはウェブアドレスでは別の意味を持つので、URL にはその二文字を置き換えた URL 安全版が必要です。
復号に失敗するのは、たいてい長さか埋め文字の問題です。Base64 の文字列の長さは四の倍数でなければならず、写すときに紛れ込んだ改行や空白があると解析器に拒まれます。