Технически, вы можете напрямую фильтровать закодированные в base64 данные по ключевым словам. Я не говорю , что это непрактично или разумное , что нужно сделать, учитывая наличие более совершенных и простых альтернатив (как описано , например , в ответ ЕКА выше), но это возможно.
Хитрость заключается в том, чтобы понять, что кодирование base64 является детерминированным отображением 3-байтовых блоков необработанных некодированных данных в 4-символьные блоки из base64 символов. Таким образом, всякий раз, когда определенная последовательность 3-байтовых блоков появляется в некодированных данных, такая же последовательность 4-символьных блоков будет появляться в кодированной версии.
Например, если вы введете строку Quanzhoucooway
в кодировщик base64 , вы получите вывод UXVhbnpob3Vjb293YXk=
. Поскольку длина входных данных не кратна 3 байтам, выходные данные содержат некоторый отступ в конце, но если мы отбрасываем последние =
знаки и последний фактический символ base64 k
(так как он также кодирует некоторые биты заполнения), мы получаем строку UXVhbnpob3Vjb293YX
который гарантированно появляются в данных в кодировке base64 всякий раз , когда байт триплеты Qua
, nzh
, ouc
, oow
и парциальное триплет ay
появляются на входе в указанном порядке.
Но, конечно, строка Quanzhoucooway
может не начинаться точно на границе триплета. Например, если мы XQuanzhoucooway
вместо этого закодируем строку , мы получим вывод WFF1YW56aG91Y29vd2F5
, который выглядит совершенно иначе. На этот раз входная длина делится на три, поэтому в конце нет символов заполнения, которые нужно отбрасывать, но нам нужно отбросить первые два символа ( WF
), каждый из которых кодирует некоторые биты из предварительно добавленного X
байта, оставляя нам F1YW56aG91Y29vd2F5
,
Наконец, кодировка base64 XXQuanzhoucooway
дает вывод WFhRdWFuemhvdWNvb3dheQ==
, который имеет заполнение на обоих концах. Удаляя первые три символа WFh
(которые кодируют XX
префикс) и последние три символа Q==
(которые кодируют нулевой битовый отступ в конце), мы остаемся со строкой RdWFuemhvdWNvb3dhe
. Таким образом, мы получаем следующие три строки в кодировке base64:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
из которых (по крайней мере) каждый должен появляться в закодированной форме base64 любой входной строки, содержащей слово Quanzhoucooway
.
Конечно, если вам не повезло, кодировщик base64 может вставить разрыв строки в середине между любыми двумя закодированными триплетами. (Например, в вашем примере сообщения есть одно между 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 как строчную, так и прописную версию ключевого слова и объединяя их в регулярное выражение, которое соответствует любой их комбинации. Например, кодировка base64 quanzhoucooway
- это cXVhbnpob3Vjb293YXk=
время, а кодировка QUANZHOUCOOWAY
- 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», при условии, что оно начинается на границе триплета. Создание двух других соответствующих регулярных выражений для сдвинутых версий оставлено в качестве упражнения. ;)
Увы, делать что-то более сложное, чем простое сопоставление подстрок, как это, быстро становится непрактичным. Но, по крайней мере, это хитрый трюк. В принципе, это может быть даже полезно, если вы по какой-то причине не можете использовать SpamAssassin или любой другой фильтр, который может декодировать кодировку base64 перед фильтрацией. Но если вы можете сделать это, вместо того, чтобы использовать такие хаки, вы, безусловно, должны.