
Steganograpy in Python | إخفاء ملفات أو بيانات في ملفات الصور
هذا السكريبت يقوم بإخفاء الملفات داخل الصور وحفظ الصورة المعدلة على القرص.
الحد الأقصى لحجم الملف الذي يمكن إخفاؤه داخل الصورة يعتمد على أبعاد الصورة.
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
ملف '100k words.txt' تم إخفاؤه في 'original_image.png' تحت اسم 'image_with_100k words.png'. اذهب وتحقق مما إذا كان يمكنك اكتشاف الفرق بين هاتين الصورتين. يمكنك استخدام هذه الوحدة لاستخراج '100k words.txt' من 'image_with_100k words.png'
الصورة الأصلية

الصورة المعدلة

هذه الصورة تحتوي على 100 ألف كلمة (ملف نصي) مخفية بداخلها!
يعتمد على مبدأ بسيط: إذا قمنا بتغيير البتات الأقل أهمية (LSB) من كل بكسل، فإن التغيير لن يكون كبيرًا ولن تلتقطه العين.
لذا، تأخذ هذه الوحدة 2 بت من البيانات المراد إخفاؤها وتستبدل آخر 2 بت من بكسل واحد بهذه الـ 2 بت، ثم تنتقل إلى البكسل التالي. أقصى تغيير في البكسل يمكن أن يكون 4 وحدات، ونطاق القيم في صورة PNG هو (0,255)، لذلك لن يكون هذا التغيير ملحوظًا.
في صورة PNG، لكل بكسل 3 قنوات: الأحمر والأخضر والأزرق. (بعض صور PNG تحتوي على قناة واحدة أو 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
لنأخذ أول 2 بت ونستبدلها بالقناة الحمراء لبكسلنا 'a_pixel'.
a_pixel = (0b10001, 0b100000, 0b1011) # تمثيل ثنائي لقيم a_pixel
# لنغير القناة الحمراء لـ a_pixel
# 0b10001 -> 0b10010 (أول 2 بت هما 10)
a_pixel = (0b10010, 0b100000, 0b1011) # البكسل المعدل
لنأخذ مرة أخرى 2 بت من binary_data ونستبدل آخر 2 بت من القناة الخضراء بهما.
a_pixel = (0b10010, 0b100000, 0b1011)
# لنغير القناة الخضراء لـ a_pixel
# 0b100000 -> 0b100001 (الـ 2 بت هما 01)
a_pixel = (0b10010, 0b100001, 0b1011) # البكسل المعدل
لنفعل ذلك مرة أخرى مع القناة الزرقاء وسننتهي.
a_pixel = (0b10010, 0b100001, 0b1011)
# لنغير القناة الزرقاء لـ a_pixel
# 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
برنامج مجاني، نعم بكل تأكيد!