・一応、base64とはなんぞや
・バイナリデータ(2進数だけでできたデータ)をASCII文字(=テキスト)に変換する方法
※バイナリ=2進数の形式
・「A-Z」「a-z」「0-9」「+」「/」だけで構成されている
・バイナリを直接扱えない場所で使う
例:メール、JSON
・見分け方(特徴)3つ (方法だけ理解したいのなら飛ばしてもいい)
・「A-Z」「a-z」「0-9」「+」「/」だけで構成されている
逆に言えば、これ以外の文字があればbase64ではないということ。
※「=」が含まれることもある。詳しくは次を見て
・末尾に「=」や「=」がついていることがある
「=」はデータの長さを調整するために使われている。次で詳しく説明
・文字数がだいたい4の倍数(下の長い説明飛ばしてもいい、「まとめると~」さえ読めば)
理由
→6ビット単位の文字列を扱う方式だから。
元データを24ビット(3バイト)ずつに区切る。
それを6ビット × 4 = 24ビット → 4文字にエンコード
※ルールに従ってデータを別の形式に変換すること。=符号化、暗号化、記号化
なんで「だいたい」?
これを少し補足すると「「=」以外の文字数がだいたい4の倍数」
自分もようわからんから自分なりになんとなく理解できるようにまとめます
「文字列を変換したらとりあえず4の倍数にしなけらばならない!!」
理由は上に書いてある通りだが、理解しなくてもそういうもんだと思えばいい。
そんで、文字列を変換したら4の倍数の文字数にしないといけない。
でも、文字列の文字数はもちろんいろいろな長さがある。
例:abc(3バイト) → YWJi ※問題なし
ab(2バイト) → YWI ※これでは4の倍数じゃない
↑こんな感じ。こういうときに使うのが、「=」←これ!
例:ab(2バイト) → YWI= ※これで文字数が4の倍数になった
まとめると
→認識では「base64は文字数が4の倍数」
厳密には「base64は文字数が4の倍数、しかし「=」も含める場合がある」
・3つの見分け方をまとめた方法
結論:grepでbase64の条件で探す!!!
文字の条件のみ↓
grep -E '^[A-Za-z0-9+/=]+$'
上+「4の倍数」という条件も追加↓
grep -E '^([A-Za-z0-9+/=]{4})+$'
上+「=も含む」という条件を追加。左から「=なし」「=が2つ」「=が3つ」↓
grep -E '^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'
※一応それぞれの文字の意味を以下にまとめる
-E→拡張機能を追加。以下参照
https://ctf-service.com/?p=306#a6
^:行の最初から条件を満たしているか?
[A-Za-z0-9+/=]: 含まれている文字の条件
+: 直前の文字(上記の条件)が1回以上繰り返されている=条件の文字だけで1文字以上ある行
$:行の終わりまでちゃんと条件にあっているものだけか?
コメント