
GUI, CLI और वेबसर्विस के साथ मल्टीप्लेटफ़ॉर्म स्टेग्नोग्राफ़ी ऐप, WEBP और AES का समर्थन करता है।
संक्षेप में, स्टेग्नोग्राफी संदेशों को लोगों की नज़र में ही बिना उन्हें एहसास हुए किसी अन्य माध्यम में छुपाने की कला है। यह कार्यान्वयन लोकप्रिय वेब प्रारूपों (WEBP, PNG, GIF, JPEG) में छवियों को पढ़ता है, उनमें (वैकल्पिक रूप से एन्क्रिप्टेड) टेक्स्ट छुपाता है और परिणाम को WEBP छवि के रूप में सहेजता है। फिर आप इस नई छवि को किसी भी सार्वजनिक वेबसाइट, फोरम, insta, FB चैट पर अपलोड कर सकते हैं, ईमेल में अटैच कर सकते हैं, जो चाहें। कोई समझ नहीं पाएगा, कोई नहीं जान पाएगा कि तस्वीर में वास्तव में एक संदेश है जब तक आप स्पष्ट रूप से उन्हें न बताएं (और यदि एन्क्रिप्शन का उपयोग किया गया था, तो निश्चित रूप से उन्हें सही पासवर्ड की भी आवश्यकता होगी)।
एक इनपुट छवि चुनें (या तो URL द्वारा या स्थानीय फ़ाइल से)
वैकल्पिक रूप से पासवर्ड दर्ज करें (यदि आप अतिरिक्त मिलिट्री-ग्रेड एन्क्रिप्शन चाहते हैं)
3/a. किसी छवि में संदेश की जांच करने के लिए, Load दबाएं। यदि कोई संदेश नहीं है या आपका पासवर्ड गलत है, तो आपको बकवास दिखाई दे सकती है।
3/b. अपना संदेश टाइप करें और Save दबाएं। एक नई छवि (अंदर छिपे संदेश के साथ) सहेजी जाएगी, उस फ़ाइल का उपयोग अपनी इच्छानुसार करें।
वेबसाइट पर जाएं।
Linux (GTK) और Windows (GDI) के लिए डाउनलोड करें। ये पोर्टेबल एक्जीक्यूटेबल हैं, इन्हें इंस्टॉलेशन की आवश्यकता नहीं है, और ये आपकी मशीन पर कोई निशान नहीं छोड़ते। GUI बिल्कुल वेब सेवा की तरह दिखता और काम करता है।

Linux और Windows (दोनों केवल libc) के लिए डाउनलोड करें। फिर टाइप करें
./stegano-cli <image file>
./stegano-cli -p <password> <image file>
छवि में संदेश को stdout पर प्रिंट करने के लिए, और
./stegano-cli <image file> <message>
./stegano-cli -p <password> <image file> <message>
एक संदेश को नई .webp छवि फ़ाइल में एन्कोड करने के लिए (यह मूल फ़ाइल को ओवरराइट कर सकता है)। वेब सेवा की तरह, पासवर्ड वैकल्पिक है। ऊपर दिए गए GUI संस्करण के विपरीत, कमांड लाइन संस्करण में बिल्कुल कोई निर्भरता नहीं है, यह हर जगह Just Works(tm) करता है।
बस src डायरेक्टरी में make चलाएं, यह suckless है। संकलन के लिए केवल emscripten के emcc और gcc की आवश्यकता है (Linux GUI संस्करण को pkg-config और GTK, GDK, pango, cairo, आदि सामान्य GTK ब्लोटवेयर की भी आवश्यकता है)।
make wasm यदि आप केवल WebAssembly संस्करण संकलित करना चाहते हैं (आवश्यक बॉयलरप्लेट HTML public डायरेक्टरी में है)।make cli यदि आप केवल कमांड लाइन संस्करण संकलित करना चाहते हैं (पूरी तरह से निर्भरता-मुक्त, किसी भी POSIX सिस्टम पर काम करना चाहिए)।make gui यदि आप केवल ग्राफिकल यूज़र इंटरफ़ेस संस्करण संकलित करना चाहते हैं (Windows GDI के लिए, अन्यथा GTK पर निर्भर करता है)।यदि आपने पासवर्ड निर्दिष्ट किया है, तो पहले आपका टेक्स्ट एन्क्रिप्ट किया जाता है। फिर छवि को एक पिक्सेलबफ़र में अनकंप्रेस किया जाता है, जहाँ आपके (एन्क्रिप्टेड) संदेश के बिट्स रंग चैनलों की चमक में संग्रहीत किए जाते हैं। इसके परिणामस्वरूप तस्वीर में बहुत हल्के तरंग पैटर्न बनते हैं, जो नग्न मानव आंखों के लिए पूरी तरह से अदृश्य होते हैं (और मूल छवि से तुलना के अभाव में, कंप्यूटर के लिए भी पूरी तरह से अदृश्य)।
लोड होने पर, छवि फिर से एक पिक्सेलबफ़र में अनकंप्रेस की जाती है, और रंग चैनलों में ये चमक तरंगें एक संयोजित बिट-चंक में परिवर्तित हो जाती हैं। यदि कोई पासवर्ड दिया गया है, तो बिट-चंक को डिक्रिप्ट किया जाता है। अंतिम संदेश UTF-8 वैधता के लिए जाँचा जाता है, और यदि यह मान्य है, तो इसे प्रदर्शित किया जाता है। (यह UTF-8 जाँच आवश्यक है क्योंकि कोई नहीं बता सकता कि छवि में वास्तव में कोई संदेश है या नहीं, या दिया गया पासवर्ड सही था या नहीं।)
संदेश को शून्य-समाप्त UTF-8 मल्टीबाइट स्ट्रीम के रूप में संग्रहीत किया जाता है, जिसमें केवल \t (क्षैतिज टैब), \r (कैरिज रिटर्न) और \n (न्यूलाइन) नियंत्रण अनुक्रमों की अनुमति है। जब वापस लोड किया जाता है, तो Windows GUI संस्करण स्टैंडअलोन \n वर्णों को \r\n CRLF अनुक्रमों में परिवर्तित करता है। सहेजते समय, CLI संस्करण \+t, \+r, \+n दो-बाइट वर्ण अनुक्रमों को स्वीकार करता है, और उन्हें संबंधित एकल-बाइट नियंत्रण वर्णों में परिवर्तित करता है।
एन्क्रिप्शन के लिए, संदेश को शून्य से पैड किया जाता है ताकि इसकी लंबाई 16 का गुणज हो, और फिर पहले sha256(salt+sha256(password)) की गणना की जाती है, जो 32 बाइनरी बाइट्स देता है, जिसमें से 16 लगातार बाइट्स को AES-256-CBC iv के रूप में उपयोग किया जाता है जो चौथे बाइट के मान modulo 16 से शुरू होता है। AES-256-CBC कुंजी तब sha256(sha256(salt+sha256(password))+salt) के रूप में आरंभ की जाती है (sha का sha का उपयोग करना पासवर्ड के खिलाफ रेनबोहैशिंग हमले का उपयोग करना अत्यंत कठिन बनाता है)। नमक Libre Steganography Standard है।
पिक्सेल के लिए, सभी छवियों को 32-बिट पैक्ड RGBA पिक्सेलबफ़र में परिवर्तित किया जाता है। चार चैनलों में से प्रत्येक के कम से कम महत्वपूर्ण 2 बिट्स का उपयोग संदेश के 8 बिट्स को संग्रहीत करने के लिए किया जाता है (जो प्रति 1 कैरियर पिक्सेल 1 संदेश बाइट देता है)। केवल अल्फा चैनल 3 से अधिक वाले पिक्सेल का उपयोग भंडारण के लिए किया जाता है, और सभी संस्करण उन पिक्सेल की संख्या को "क्षमता N बाइट्स।" के रूप में रिपोर्ट करते हैं।
1 message byte's bits (7 MSB, 0 LSB): 76543210
1 carrier pixel (alpha last, red first byte): rrrrrr76 gggggg32 bbbbbb54 aaaaaa10 (a!=0)
(यह गैर-पारदर्शी हैक आवश्यक है क्योंकि WEBP कोडेक उतना दोषरहित नहीं है जितना वह दावा करता है। अल्फा 3 से अधिक होने पर, यह गारंटी है कि पिक्सेल पारदर्शी नहीं है भले ही एन्कोडेड बिट्स शून्य हों।)
यह स्टेग्नोग्राफी टूल GPLv3+ (या उस लाइसेंस के किसी भी बाद के संस्करण) की शर्तों के तहत लाइसेंस प्राप्त है। यह stb_image (जो सार्वजनिक डोमेन है) और libwebp (जो BSD-3-Clause के तहत लाइसेंस प्राप्त है) से स्थिर रूप से जुड़ा हुआ है। SHA हैश और AES एन्कोडर/डिकोडर भाग इनलाइन किए गए हैं (मेरे द्वारा लिखे गए), किसी तृतीय-पक्ष क्रिप्टोग्राफिक लाइब्रेरी की आवश्यकता नहीं है।
शुभकामनाएँ, bzt