منتدى المنتدى
قسم لغات البرمجة
أبو هاجر الحلوة
الجزائر
2007
خوارزم لإخفاء النصوص داخل الصور
الـ Sténographie ( المصطلح بالفرنسية و لا أعرف المقابل الصحيح له بالإنجليزية) هي فن إخفاء المعلومة (عادة نصوص) داخل معلومة أخرى ( في أغلب الأحيان صورة أو ملف صوتي) دون تأثير ظاهر عليهما , هناك خوارزمات كثيرة و معروفة و هي متفاوتة من حيث درجة الصعوبة و مدى كفاءتها أي من السهل الساذج إلى غاية المعقد الفعال , و الخوارزم الذي سنتعرف عليه يقع بين هذين الطرفين و هو لأخفاء النصوص داخل الصور النقطية (Bitmap) من ناحية التأثير على الصورة فلا يكاد يذكر و من المستحيل على العين المجردة أن تدرك التغيير الذي يحدثه أما من ناحية النص المدرج فيمكن أن يكون هناك ضياع يسير جدا لبعض الحروف لكنه لا يكاد يذكر أيضا ففي رسالة معتبرة قد لا يتجاوز حجم الضياع الثلاث أو أربع حروف باختصار يمكن إعتبار هذا الخوارزم سهل و فعال إلى درجة كبيرة.
أولا : المتغيرات :
Buffer: المتغيرة التي تحوي النص و نظيف لها الحرف "#" لنتمكن من تحديد نهاية النص
Length : عدد حروف النص المراد إخفاءه (أي طول المتغيرة Buffer)
Bx : عرض الصورة التي نريد إخفاء الـ Buffer فيها
By : طول الصورة التي نريد إخفاء الـ Buffer فيها
iClr : متغيرة عددية سنستعملها لاسترجاع النقاط (Pixels) المكونة للصورة نقطة نقطة
ِِiChr : متغيرة نصية سنستعملها الاسترجاع الحروف المكونة للنص الذي نريد إخفاءه (أي النص الموجود في المتغيرة Buffer) أيضا حرفا حرفا
Px و Py : عددان لسبر كل النقاط المكونة للصورة
ثانيا : الخطوات :
1 - 1 / تشفير النص داخل الصورة:
من أجل اي نقطة M(Px,Py) في الصورة يكون ترتيبها أقل أو يساوي المتغيرة Length نقوم بما يلي :
نفكك النقطة M(Px,Py) (و التي هي عبارة عن لون) إلى الألوان الأساسية المكونة لها أي الأحمر و الأخضر و الأزرق (RGB) نقوم بتعريف ثلاث متغيرات عددية iRed , iGreen , iBlue لاسترجاع مكونات اللون حسب الترتيب RGB فإن الأوامر تكون كما يلي
في الدلفي
كود:
iRed := GetRValue(image.canvas.Pixels[Px, Py]);
iGreen := GetGValue(image.canvas.Pixels[Px,Py]);
iBlue := GetBValue(image.canvas.Pixels[Px,Py]);
أما في الفجوال بيسك
كود:
iRed = iClr Mod 256
iGreen = ((iClr And &HFF00) / 256&) Mod 256&
iBlue = (iClr And &HFF0000) / 65536
و من أجل أي حرف iChr من Buffer يكون ترتيبه هو نفس ترتيب النقطة M(Px,Py) التي قمنا بتفكيكها سابقا إلى ألوانها الأساسية نقوم بما يلي
نعدل قيمة اللون الأحمر الموجود في المتغيرة iRed كما يلي
كود:
iRed = iRed And 248 Or (iChr And 7)
ثم نعدل قيمة الأخضر كما يلي :
كود:
iGreen := iGreen and 248 or ((iChr and 56) shr 3);
هذا في الدلفي أما في الفجوال بيسك فنقوم بتغير الجزء shr 3 بـ / 8 لأن البيسك لا يوفر أوامر تتعامل مع المتغيرات على مستوى البت إلا أن النتيجة هي نفسها و بهذا سيكون الأمر السابق في البيسك كما يلي :
كود:
iGreen = iGreen And 248 Or ((iChr And 56) \ 8)
ثم نقوم بتعديل قيمة الأزرق
في الدلفي :
كود:
iBlue := iBlue and 252 or ((iChr and 192) shr 6);
و في البيسك :
كود:
iBlue = iBlue And 252 Or ((iChr And 192) \ 64)
في الأخير نقوم باسترجاع قيمة النقطة M(Px,Py) الجديدة باستعمال الدالة RGB إعتمادا على المكونات iRed , iGreen , iBlue التي حصلنا عليها سابقا ثم نعوضها في الصورة في نفس مكان النقطة القديمة
نكرر نفس العملية مع باقي النقاط حتى نقوم بتشفير جميع الحروف المكونة للنص ثم نقوم بحفظ الصورة بامتداد bmp
1 - 2 / استخراج النص المشفر داخل الصورة :
من أجل أي نقطة M(Px,Py) في الصورة حيث تتغير Px من 0 إلى Bx و Py تتغير من 0 إلى By و ما دام iChr يختلف عن القيمة "#" نقوم بما يلي :
نسترجع المكونات iRed , iGreen , iBlue كما سبق ثم نقوم باسترجاع الحرف iChr الموافق للنقطة كما يلي :
في الدلفي :
كود:
iChr := ((iBlue and 3) shl 6) or ((iGreen and 7) shl 3) or (iRed and 7);
و في البيسك :
كود:
iChr = ((iBlue And 3) * 64) Or ((iGreen And 7) * 8) Or (iRed And 7)
ملاحظات :
حتى تتمكن من تشفير كل النص في الصورة المختارة ينبغي أن تتحقق من الشرط التالي
أي أن طول النص يجب أن يكون أصغر أو يساوي حجم الصورة .
إذا تم الإخلال بهذا الشرط فيمكنك دائما حساب نسبة التشفير بالعلاقة :
كود:
((Bx * By) / Length) * 100
في المرفقات ستجد مصدر برنامج ArArgonaut و هو مصدر برنامج بالفجوال بيسك يستعمل نفس الخوارزم .
تم بحمد الله .