
Python में स्टेग्नोग्राफी | इमेज फाइलों में फ़ाइलों या डेटा को छिपाएं
यह स्क्रिप्ट फ़ाइलों को इमेज के अंदर छिपाएगी और संशोधित इमेज को डिस्क पर सहेजेगी
इमेज के अंदर छिपाई जा सकने वाली फ़ाइल का अधिकतम आकार इमेज के आयामों पर निर्भर करता है।
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
'100k words.txt' को 'original_image.png' में छिपाया गया है जिसका नाम 'image_with_100k words.png' रखा गया है। जाएँ और जाँचें कि क्या आप इन दोनों इमेज के बीच अंतर देख सकते हैं। आप इस मॉड्यूल का उपयोग 'image_with_100k words.png' से '100k words.txt' निकालने के लिए कर सकते हैं।
मूल इमेज

संशोधित इमेज

इस इमेज में 100k शब्द (एक टेक्स्ट फ़ाइल) छिपे हुए हैं!
यह एक सरल सिद्धांत पर आधारित है कि यदि हम प्रत्येक पिक्सेल के LSB (लिस्ट सिग्निफिकेंट बिट्स) को बदलते हैं, तो परिवर्तन महत्वपूर्ण नहीं होगा और आँखों से ध्यान नहीं दिया जाएगा।
इसलिए, यह मॉड्यूल छिपाई जाने वाली फ़ाइल से 2 बिट डेटा लेता है और एक पिक्सेल के अंतिम 2 बिट्स को उन 2 बिट्स से बदल देता है, और फिर अगले पिक्सेल पर चला जाता है। पिक्सेल में अधिकतम परिवर्तन 4 यूनिट हो सकता है, और PNG इमेज में मानों की सीमा (0,255) है, इसलिए यह परिवर्तन महत्वपूर्ण नहीं होगा।
PNG इमेज में, प्रत्येक पिक्सेल में 3 चैनल होते हैं: लाल, हरा और नीला। (कुछ PNG इमेज में 1 या 4 चैनल होते हैं, लेकिन यह प्रोग्राम उन्हें 3 चैनलों में बदल देगा।) एक सामान्य पिक्सेल PNG इमेज में इस तरह दिखता है:
a_pixel = (17,32,11) # (RED, GREEN, BLUE)
तो, हम एक पिक्सेल में 3 गुना 2 बिट बचा सकते हैं, यानी प्रति पिक्सेल 6 बिट। यह हमें फ़ाइल आकार की ऊपरी सीमा तक ले जाता है, जिसे एक इमेज में छिपाया जा सकता है:
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
आइए एक उदाहरण लेकर समझते हैं। छिपाया जाने वाला डेटा है:
binary_data = 0b100111
आइए पहले दो बिट लें और उन्हें हमारे 'a_pixel' के RED चैनल से बदलें।
a_pixel = (0b10001, 0b100000, 0b1011) # बाइनरी प्रतिनिधित्व a_pixel मानों का
# आइए a_pixel के RED चैनल को बदलें
# 0b10001 -> 0b10010 ( पहले 2 बिट 10 हैं )
a_pixel = (0b10010, 0b100000, 0b1011) # संशोधित पिक्सेल
आइए फिर से binary_data से 2 बिट लें और GREEN चैनल के अंतिम 2 बिट्स को उनसे बदलें।
a_pixel = (0b10010, 0b100000, 0b1011)
# आइए a_pixel के GREEN चैनल को बदलें
# 0b100000 -> 0b100001 ( 2 बिट 01 हैं )
a_pixel = (0b10010, 0b100001, 0b1011) # संशोधित पिक्सेल
आइए इसे BLUE चैनल के साथ एक बार और करें और हम कर लेंगे।
a_pixel = (0b10010, 0b100001, 0b1011)
# आइए a_pixel के BLUE चैनल को बदलें
# 0b1011 -> 0b1011 ( 2 बिट 11 हैं ); ध्यान दें कि इस बार मान नहीं बदला
a_pixel = (0b10010, 0b100001, 0b1011) # इस बार पिक्सेल संशोधित नहीं हुआ
तो, हमने अपना 6 बिट संदेश एक पिक्सेल में छिपा दिया है, आइए पिक्सेल में हुए परिवर्तनों को देखें:
a_pixel = (0b10001, 0b100000, 0b1011) = (17, 32, 11)
a_pixel_with_data = (0b10010, 0b100001, 0b1011) = (18, 33, 11)
जैसा कि हम देख सकते हैं कि परिवर्तन पिक्सेल स्तर पर भी ध्यान देने योग्य नहीं है। मॉड्यूल इसे तब तक दोहराता है जब तक हमारा सारा डेटा इमेज में सहेज नहीं जाता।

नोट: फोटो में शोर बढ़ जाता है और यदि हम किसी फोटो संपादन सॉफ्टवेयर का उपयोग करके इसकी तुलना मूल इमेज से करते हैं, तो इस इमेज में मूल इमेज की तुलना में बहुत अधिक शोर होगा।
इस समस्या का समाधान: मूल इमेज को इंटरनेट पर कभी अपलोड/शेयर न करें।
MIT
मुफ्त सॉफ्टवेयर, बहुत बढ़िया!