तकनीकी रूप से, आप कीवर्ड के लिए सीधे आधार 64 एन्कोडेड डेटा को फ़िल्टर कर सकते हैं। मैं यह नहीं कह रहा हूँ कि यह एक व्यावहारिक या ऐसा करने के लिए एक उचित बात है, (ऊपर ईएसए के जवाब में वर्णित जैसे) के रूप में बेहतर और सरल विकल्प के अस्तित्व दिया है, लेकिन यह है संभव।
चाल का एहसास है कि base64 एन्कोडिंग base64 वर्णों के 4-वर्ण ब्लॉक में कच्चे अनएकेडेड डेटा के 3-बाइट ब्लॉक का एक नियतात्मक मानचित्रण है। इस प्रकार, किसी भी समय 3-बाइट ब्लॉक का एक निश्चित अनुक्रम अनएन्कोडेड डेटा में दिखाई देता है, 4-वर्ण ब्लॉक का एक ही क्रम एन्कोडेड संस्करण में दिखाई देगा।
उदाहरण के लिए, यदि आप स्ट्रिंग Quanzhoucooway
को बेस 64 एनकोडर में दर्ज करते हैं , तो आपको आउटपुट मिलेगा UXVhbnpob3Vjb293YXk=
। चूंकि इनपुट की लंबाई 3 बाइट्स से अधिक नहीं है, इसलिए आउटपुट में अंत में कुछ पैडिंग होती है, लेकिन अगर हम अंतिम =
संकेतों और अंतिम वास्तविक बेस 64 कैरेक्टर को छोड़ देते हैं k
(क्योंकि यह कुछ पैडिंग बिट्स को एन्कोड करता है), तो हमें स्ट्रिंग मिलती है UXVhbnpob3Vjb293YX
कि बेस 64 एन्कोडेड डेटा में प्रदर्शित करने के लिए जब भी बाइट तीनो की गारंटी है Qua
, nzh
, ouc
, oow
और आंशिक त्रिक ay
इसी क्रम में इनपुट में दिखाई देते हैं।
लेकिन, निश्चित रूप से, स्ट्रिंग Quanzhoucooway
ट्रिपल सीमा पर बिल्कुल शुरू नहीं हो सकती है। उदाहरण के लिए, यदि हम XQuanzhoucooway
इसके बजाय स्ट्रिंग को एन्कोड करते हैं, तो हमें आउटपुट मिलता है WFF1YW56aG91Y29vd2F5
, जो पूरी तरह से अलग दिखता है। इस बार, इनपुट लंबाई तीन से विभाज्य है, इसलिए अंत में छोड़ने के लिए कोई पेडिंग वर्ण नहीं हैं, लेकिन हमें पहले दो वर्णों को त्यागने की आवश्यकता है ( WF
जो प्रत्येक पूर्वनिर्मित X
बाइट से कुछ बिट्स को एन्कोड करते हैं , हमें छोड़ कर F1YW56aG91Y29vd2F5
।
अंत में, बेस 64 एन्कोडिंग XXQuanzhoucooway
आउटपुट देता है WFhRdWFuemhvdWNvb3dheQ==
, जिसमें दोनों सिरों पर पैडिंग होती है। पहले तीन वर्ण WFh
(जो कि XX
उपसर्ग को कूटबद्ध करते हैं ) और अंतिम तीन वर्ण Q==
(जो अंत में शून्य बिट पैडिंग को सांकेतिक शब्दों में बदलना) को हटाते हैं, हम स्ट्रिंग के साथ छोड़ दिए जाते हैं RdWFuemhvdWNvb3dhe
। इस प्रकार, हम निम्नलिखित तीन बेस 64-एन्कोडेड स्ट्रिंग्स प्राप्त करते हैं:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
जिनमें से (कम से कम) एक को किसी भी इनपुट स्ट्रिंग के बेस 64 एन्कोडेड रूप में दिखाई देना चाहिए जिसमें शब्द हो Quanzhoucooway
।
बेशक, यदि आप अशुभ हैं, तो बेस 64 एनकोडर किसी भी दो एन्कोडेड ट्रिपल के बीच में एक लाइन ब्रेक डाल सकता है। (आपका उदाहरण संदेश, उदाहरण के लिए, के बीच एक है F1YW56
और aG91Y29vd2F5
मज़बूती से regexps के साथ इन तार मिलान करने के लिए, आप निम्न (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 एनकोडर प्रदान करता है।
यदि आप वास्तव में चाहते थे, तो आप बेस -64 एन्कोडिंग द्वारा कीवर्ड के अपरकेस और अपरकेस संस्करण दोनों के केस-असंवेदनशील मिलान को लागू कर सकते हैं और उन्हें किसी भी संयोजन से मेल खाने वाले regexp में जोड़ सकते हैं। उदाहरण के लिए, का बेस 64 एन्कोडिंग 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
बेस 64 एनकोडेड शब्द "Quanzhouकोवे" से किसी भी मामले में मेल खाएगा, बशर्ते कि यह एक ट्रिपल सीमा पर शुरू हो। शिफ्ट किए गए संस्करणों के लिए अन्य दो संबंधित रेगीक्स उत्पन्न करना एक अभ्यास के रूप में छोड़ दिया गया है। ;)
काश, साधारण प्रतिस्थापन की तुलना में अधिक जटिल कुछ भी करना इस तरह जल्दी से अव्यवहारिक हो जाता है। लेकिन कम से कम यह एक साफ-सुथरी चाल है। सिद्धांत रूप में, यह उपयोगी भी हो सकता है, यदि आप किसी कारण से स्पैमासिस या किसी अन्य फ़िल्टर का उपयोग नहीं कर सकते हैं जो फ़िल्टर करने से पहले बेस 64 एन्कोडिंग को डिकोड कर सकता है। लेकिन अगर आप ऐसा कर सकते हैं, तो इस तरह के हैक का उपयोग करने के बजाय, आपको निश्चित रूप से करना चाहिए।