技術的には、キーワードのbase64エンコードデータを直接フィルタリングできます。より良い、より単純な代替案が存在することを考えると、それは実践的または合理的なことだとは言っていません(上記のEsaの回答などで説明されています)が、ある可能。
トリックはそれを実現することです 秘は、base64エンコードが、エンコードされていない生データの3バイトブロックをbase64文字の4文字ブロックに決定論的にマッピングです。したがって、エンコードされていないデータに3バイトブロックの特定のシーケンスが表示されるたびに、エンコードされたバージョンに同じ4文字ブロックのシーケンスが表示されます。
たとえば、文字列Quanzhoucooway
をbase64エンコーダーに入力すると、出力が取得されますUXVhbnpob3Vjb293YXk=
。入力の長さが3バイトの倍数ではないため、出力の最後にパディングが含まれますが、最後の=
符号と最後の実際のbase64文字を削除するとk
(パディングビットもエンコードするため)、文字列を取得しますUXVhbnpob3Vjb293YX
Base64でエンコードされたデータたびバイトトリプレットに表示されるように保証されるQua
、nzh
、ouc
、oow
及び部分トリプレットay
、その順に入力に現れます。
しかし、もちろん、文字列Quanzhoucooway
はトリプレット境界で正確に開始しない場合があります。たとえば、XQuanzhoucooway
代わりに文字列をエンコードすると、WFF1YW56aG91Y29vd2F5
まったく異なる外観のoutputが取得されます。今回は、入力長は3で割り切れるため、最後に破棄するパディング文字はありませんがWF
、先頭の2 X
バイトの文字()を破棄する必要があります。F1YW56aG91Y29vd2F5
。
最後に、base64エンコーディングXXQuanzhoucooway
はoutput を提供WFhRdWFuemhvdWNvb3dheQ==
し、両端にパディングがあります。最初の3文字WFh
(XX
プレフィックスをエンコードする)と最後の3文字Q==
(末尾のゼロビットパディングをエンコードする)を削除すると、文字列が残りますRdWFuemhvdWNvb3dhe
。したがって、次の3つのbase64エンコード文字列を取得します。
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
その(少なくとも)1つは、wordを含む入力文字列のbase64エンコード形式で表示される必要がありますQuanzhoucooway
。
もちろん、運が悪ければ、base64エンコーダーは、エンコードされた2つのトリプレットの間に改行を挿入する場合があります。(たとえば、メッセージの例はF1YW56
との間にありaG91Y29vd2F5
ます。)したがって、これらの文字列を正規表現と確実に一致させるには、次のようなものが必要です(PCRE構文を使用)。
/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD
これらのパターンを手作業で生成するのは面倒ですが、少なくともbase64エンコーダーを提供している限り、お気に入りのプログラミング言語で簡単なスクリプトを作成するのは難しくありません。
本当に必要な場合は、大文字と小文字を区別しないマッチングを実装することもできます。キーワードの小文字と大文字の両方をbase64エンコードし、それらを任意の組み合わせに一致する正規表現に結合します。たとえば、quanzhoucooway
is のbase64エンコーディングcXVhbnpob3Vjb293YXk=
はQUANZHOUCOOWAY
is UVVBTlpIT1VDT09XQVk=
であるため、ルールは次のとおりです。
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
いずれの場合でも、base64でエンコードされた単語「Quanzhoucooway」と一致します。ただし、トリプレット境界で始まる場合に限ります。シフトされたバージョンに対応する他の2つの正規表現の生成は、演習として残されています。;)
残念ながら、このような単純な部分文字列のマッチングよりも複雑なことを行うとすぐに非現実的になります。しかし、少なくともそれはきちんとしたトリックです。原理的には、何らかの理由でSpamAssassinや、フィルタリングの前にbase64エンコードをデコードできる他のフィルターを使用できなかった場合に役立ちます。しかし、このようなハックを使用する代わりに、それを行うことができる場合、あなたは確かにすべきです。