بيثون وإخفاء المعلومات

منذ وقت ليس ببعيد ، تم عقد هاكاثون تجريبي للطلاب في مدرستي . كان موضوع المهام يتعلق بأمن المعلومات ، بما في ذلك تشفير البيانات.



واحدة من أكثر المهام الملونة كانت TASK-10: إخفاء المعلومات .
نعطي تعريف.
يعد إخفاء المعلومات طريقة لنقل المعلومات أو تخزينها ، مع مراعاة سرية حقيقة هذا النقل (التخزين).
وبعبارة أخرى ، إذا كان التشفير يخفي المعلومات نفسها ، فإن إخفاء المعلومات يخفي حقيقة انتقالها.



لسوء الحظ ، لم يكن لدي الفريق ولدي الوقت لإكمال هذه المهمة في الوقت المحدد ، وقررت إكمالها بعد الحدث.

يبدو أن الحل الأكثر وضوحًا في ذلك الوقت هو:

  1. تحويل النص المشفر إلى مجموعات بت.
  2. افعل نفس الشيء مع الصورة.
  3. ضع النص في مكان عشوائي على الصورة واحفظه كصورة.

إليك شفرة صغيرة لتحويل النص إلى مجموعات بت والعكس.

def text_to_binary(event): return [int(format(ord(elem),'b')) for elem in event] def binary_to_text(event): return [chr(int(str(elem),2)) for elem in event] 

ومع ذلك ، بعد أن أخبرت زملائي الأكثر خبرة عن أفكاري ، أُرسلت لتدريس المواد.
تحتاج إلى البدء بحقيقة أنه لا يمكن تحرير وحدات بايت ملف الصورة مباشرة إذا لم يكن bmp.

{٪ - التشفير العشوائي٪}
بعد قراءة القليل عن نماذج الألوان ، قررت التخلي عن تحلل الصورة إلى 1 و 0 لصالح تعديلات البكسل نفسها في لوحة RGB. لهذه التلاعبات ، اخترت مكتبة الوسائد ، وهنا مقال جيد عنها.

لذلك لدينا صورة. الصورة تحتوي على بكسل. تتكون البكسل من الألوان الأساسية - الأحمر والأخضر والأزرق.

يتم ترميز كل من الألوان برقم من 0 إلى 255.



ولدينا أيضًا أحرف ASCII مشفرة أيضًا.

دعنا نحاول تشفير بعض النص في هذه الصورة.

صورة:




جزء من النص:
C يجعل من السهل إطلاق النار على نفسك في القدم. يجعل C ++ الأمر أكثر صعوبة ، ولكن عندما تفعل ذلك ، فإنه يفجر ساقك بالكامل
ربط المكتبات اللازمة.

 from PIL import Image, ImageDraw from random import randint 

ثم نعلن الوظيفة ونضع فيها كل الأشياء المفيدة لنا.

 def stega_encrypt(): keys = [] img = Image.open(input("path to image: ")) draw = ImageDraw.Draw(img) width = img.size[0] height = img.size[1] pix = img.load() f = open('keys.txt','w') 

أكثر إثارة للاهتمام. أهم مهمة هي التوصل إلى طريقة يمكن من خلالها تشفير الرسائل. لقد اقترحت هذه الطريقة :

  1. خذ شخصية ، ترجمها إلى رقم ASCII
  2. قم بإنشاء مجموعة مع إحداثيات عشوائية
  3. نقوم بجمع ظلال خضراء وزرقاء من بكسل عند الإحداثيات
  4. استبدل الصبغة الحمراء برقم حرف ASCII

 for elem in ([ord(elem) for elem in input("text here: ")]): key = (randint(1,width-10),randint(1,height-10)) g, b = pix[key][1:3] draw.point(key, (elem,g , b)) f.write(str(key)+'\n') 

نحفظ المفاتيح والصورة.

 print('keys were written to the keys.txt file') img.save("newimage.png", "PNG") f.close() 

كود

نحاول تنفيذ البرنامج النصي.

ونتيجة لذلك ، حصلنا على نفس الصورة ، ولكن بتنسيق png وبضعة وحدات بكسل متغيرة.



الآن يبقى لفك كل شيء بطريقة أو بأخرى.

نحن نكتب سيناريو لفك التشفير!

نحن نربط كل ما هو مطلوب.

 from PIL import Image from re import findall 

نعلن وظيفة لفك التشفير ، وكذلك العديد من الأشياء.

 def stega_decrypt(): a = [] keys = [] img = Image.open(input("path to image: ")) pix = img.load() f = open(input('path to keys: '),'r') y = str([line.strip() for line in f]) 

خوارزمية فك التشفير الأساسية:

 for i in range(len(findall(r'\((\d+)\,',y))): keys.append((int(findall(r'\((\d+)\,',y)[i]),int(findall(r'\,\s(\d+)\)',y)[i]))) for key in keys: a.append(pix[tuple(key)][0]) return ''.join([chr(elem) for elem in a]) 

هذه التعبيرات العادية مطلوبة لقراءة الصفوف من ملف نصي.

الإجراء الأخير هو عرض رسالة مشفرة على الشاشة.

 print("you message: ", stega_decrypt()) 

كود

حاول الآن الحصول على رسالتنا.



كما هو مطلوب لإثبات أن كل شيء يعمل!

العيب الرئيسي: رؤية وحدات البكسل الميتة في الصورة في حالة تشفير عدد كبير من الأحرف. ومع ذلك ، يتم تصحيح هذا العيب بدقة عالية.

المراجع:

Source: https://habr.com/ru/post/ar413803/


All Articles