مقال : برمجه سكربت بلغه البايثون لأخفاء النصوص في الصور والفيديوهات
سنتحدث اليوم عن أستخدام لغه البايثون في علم Steganography وهو علم يختص بأخفاء ملف,رساله,صوره,فيديو بملف أخر , والفرق بينه وبين التشفير هو أننا نلجأ لاخفاء المعلومات داخل شئ أخر عوضا عن تشفيرها.
وفي مقاله اليوم سنتحدث عن أخفاء نص في صوره بتكنيك بسيط أكتشفته بينما كنت أتعلم الـimage processing
وقبل أن نبدأ في شرح برمجه السكربت هناك متطلبات لابد من وجودها :
- بايثون أصدار 2.7
- مكتبه Opencv وتستطيع تحميلها من هنا وأختيار النظام الذي تستخدمه
- مكتبه Numpy وتستطيع تحميلها من هنا
- صوره 😀
والأن نتأكد من نزول المكتبات لديك بشكل سليم عن طريق الأمر :
import numpy ,cv2
والأن في مكتبه opencv أذا أردت قراءه صوره لتفعل بها ماتريده بعدها تقوم بتطبيق الأمر الأتي
img = cv2.imread(image)
حيث المتغير image يكون هو أسم الصوره ولو أردت عرضها أمامك تقوم بالتالي
img = cv2.imread(image) cv2.imshow('image show',img) if cv2.waitKey(0)==ord("q"): cv2.destroyAllWindows()
في السطر الثاني قمت بعرض الصوره عن طريق imread ولكن لن تري شئ وبالتالي ستحتاج الي waitKey وهنا جعلناه ينتظر الضغط علي الحرف q لغلق الصوره عن طريق قيمه الـascii لحرف الـq
وهذه النتيجه علي جهازي
والأن لا داعي لذكر أي أساسيات أخري من أساسيات المكتبه ونبدأ في الأهم
كل صوره مما تراه أمامك علي الشاشه تتكون من (Pixels) وكتعريف سريع فا البكسل هو أصغر نقطه في الصوره أو هو الجزء الأصغر من الصوره القابل للتحكم وهو لا يري بالعين المجرده
كل صوره تراها تتكون من مئات بل وألاف البكسلز وكل بكسل منهم يحمل لون مما يكون الصوره واللون لكي يتكون يكون خليط من ثلاث ألوان وهو الأحمر والأخضر والأزرق وهذا يسمي بنظام الـRGB
والأن كيف نستفيد من هذا لتخزين المعلومات ؟
كل لون من الألوان الثلاثه يستطيع أن يحمل قيمه عدديه من 0-255 ولكن أولا هل سمعت عن ascii ؟
الأسكي هو نظام يستبدل كل رمز برقم وهو يستخدم في التواصل ما بين الأجهزه ويمتد مدي أعداد الـascii من 0 الي 255 مقسمه الي ثلاث مجموعات أهمها المجموعه الثانيه وهي مجموعه الحروف القابله للكتابه وهي في المدي 32-127
والأن بعد أن لاحظت أن مدى أعداد الأسكي هو نفس المدى التي تستطيع أن تتحمله ألوان الـRGB وأن البكسل لا يري بالعين المجرده أذن لم لا نقوم بتغيير قيم ألوان بكسلز محدده بقيم الأسكي الخاص بالحروف 😀
ولمعلوماتك الصوره لن تتلف والقيم لن تتغير لأنك قمت بتغيير قيمه لون لا أكثر 😀 والأن لنبدأ العمل علي ذلك
لتعدل ألوان بكسل ما يجب أن تحدد مكانه ولعمل هذا يكون عن طريق تحديد العامود والصف الذي يوجد البكسل بتقاطعهما فمثلا أن أردنا فعلا هذا في البايثون يكون كالأتي
>>> import cv2 >>> import numpy as np >>> img = cv2.imread('test.jpg') >>> print img[100,100] [ 60 186 234]
كما ترى فعند تحديد مكان البكسل تقوم بايثون بطباعه قيمه ألوان الـRGB الخاصه به الثلاثه ولو أردنا قيمه لون واحد منهم نقوم بالتالي
>>> print img[100,100,0] 60
او نستطيع القيام بالتالي
>>> print img.item(100,100,0) 60
والأن أذا أردنا تعديل قيمه لون ما خاص ببكسل
>>> img.itemset((100,100,0),120) >>> print img.item(100,100,0) 120
كما ترى أصبحت قيمه اللون 120 والأن لنطبق هذا علي الحروف ولنأخذ كلمه isecurity كا مثال
img = cv2.imread( "test.png" ) n = 1 for i in "isecurity": try: img.itemset((0,n,0),ord(i)) n += 1 except: break cv2.imwrite( "Stegano.png" , img )
الأن وضعنا كلمه isecurity بداخل الصوره فهذه الصوره الأصليه
وهذه بعد وضع الكلمه
كما ترى لا فرق 😀
الأن لنقوم بأستخراج الكلمه من الصوره مجددا نحن بحاجه لمعرفه طول الكلمه ولذلك عند أستخدام هذا السكربت في أرسال رسائل سريه أحرص علي أرسال طول الرساله أيضا مع الصوره للمستلم
الأن لنكتب كود أستخراج الرساله
>>> img = cv2.imread("stegano.png") >>> length = len("isecurity") >>> text = "" >>> for i in range( 1 , length+1 ): >>> text += chr(img.item(0,i,0)) >>> print text 'isecurity'
كما تري أستخرجنا الرساله من الصوره سليمه 😀
والأن نكتب دالة (function) لأخفاء الصور وأخري لأستخراج الرساله من الصور لتصبح العمليه أسهل ووضعها في سكربت
def hide( text , image ): img = cv2.imread( image ) to = image.split(".")[0] + "_stegano.png" n = 1 for i in text: try: img.itemset( ( 0 , n , 0 ) , ord( i ) ) n += 1 except: break cv2.imwrite( to , img ) print " [+] Finished...written to " + to print " "*2 + "Text length : " + str( len( written ) ) def unhide( image ,length): img = cv2.imread( image ) text = "" for i in range( 1 , length+1 ): text += chr( img.item( 0 , i , 0 ) ) print " [+] Finished.." print " -Hidden msg : " print "\t" + str( text )
والأن أنهينا, السكربت والفكره التي أعتمدنا عليها بسيطه للغايه فهنالك سكربتات أخري تعمل بطرق أكثر تعقيدا فمثلا الأن أردنا تطوير الفكره ونخفي الرساله في فيديو فماذا نفعل ؟
ولكن أولا مما يتكون الفيديو ؟
يتكون الفيديو من عده فريمز (Frames) تتحدث بصوره مستمره في زمن قليل فلا تُرى العين المجرده تبدل الفريمز ودعني الأن أخبرك بمعلومه قيمه وهي أنه يمكن في مكتبه Opencv معالجه كل فريم وكأنه صوره 😀 أظن أنك فهمت الأن إلي ماذا أشير 😀
الأن بسرعه لنقوم بفتح ملف فيديو نقوم بالأتي
import cv2 vid = cv2.VideoCapture("test.mp4") while(True): _, frame = vid.read() cv2.imshow('Video',frame) if cv2.waitKey(1) == ord('q'): break vid.release() cv2.destroyAllWindows()
والأن لنعدل الفريم بسرعه نقوم بتعديل بعمل فانشكن جديده تشبه hide ولكن للفريمز
def hide_in_frame( text , frame ): n = 1 for i in text: try: frame.itemset( ( 0 , n , 0 ) , ord( i ) ) n += 1 except: break print " [+] Finished..." print " "*2 + "Text length : " + str( len( text ) ) return frame import cv2 vid = cv2.VideoCapture("test.mp4") frame_number = 1 while(True): _, frame = vid.read() if frame_number == 10: frame = hide_in_frame( "isecurity" , frame ) frame_number +=1 cv2.imshow('Video',frame) if cv2.waitKey(1) == ord('q'): break vid.release() cv2.destroyAllWindows()
وحتي لا أطيل المقاله أكثر ستقوم بنفس ما فعلت مع الصور مع فرق أنك تتعامل مع فيديو والأن لكي يقوم أحد بأستخراج الرساله يجب أن يعرف طول الرساله ورقم الفريم الموجوده فيه
أرجو أن تكونوا قد استفدتم من هذه المقالة، لا تترددوا في ترك أسئلتكم و إستفساراتكم إذا ما كان هناك جزئية غير واضحه .
مقالات اخرى عن Steganography :
مقال مفيد كريم .
ايضا يمكن ان نقوم باخفاء هاش لرساله في النص وتطوير السكربت اولا يقوم بتوليد الهاش ثم اخفائه والعكس في السكربت الي عند المستقبل .
مشكور جدا
رائع 🙂
شكرا كريم
السلام عليكم لدي سؤال هل بامكان جوجل التعرف على النص في الصورة ؟
لا جوجل لا يمكنه التعرف عليه !!
ممكن دروس للبايثون من الصفر حتى الاحتراف و ما هي افضل النسخ اللي لازم اعمل عليها .. لاني كنت ابتديت عليه العمل من زمان ثم توقفت ..
بأذن الله راح يكون في أكثر من كورس للبايثون حتي الأحتراف وبالنسبه للنسخه فلا تفرق سواء 2 أو 3 لكن 2 من الممكن أن تكون أسهل قليلا
الاستاذ كريم شعير ارجو التواصل للضرورة اريد برمجة سكربت خاص مدفوع الثمن يقوم بإخفاء نص بالفيديو ولكن المشكلة بان النص يظهر في اماكن عشوائية و اوقات مختلفة.
Skype: usa.rout
لو تم رفع الصورة على الانترنت، فسيتم تقليل جودتها وحجمها، ألن يؤثر هذا على عدد البيكسلز؟ وبالتالي الكلمات المخبئة؟؟