إخفاء المعلومات LSB

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

سنحاول اليوم التعمق أكثر وإلقاء نظرة على خوارزمية LSB. إذا كنت مهتمًا، فنحن نرحب بك تحت عنوان cat. (تحت القطع حركة المرور: حوالي ميغابايت.)

بادئ ذي بدء، من الضروري تقديم مقدمة قصيرة. يعلم الجميع أن الغرض من التشفير هو جعل قراءة المعلومات السرية مستحيلة. بالطبع، التشفير له تطبيقاته، ولكن هناك نهج آخر لحماية البيانات. ليس علينا تشفير المعلومات، ولكن التظاهر بأننا لا نملكها. وهذا هو بالضبط سبب اختراع إخفاء المعلومات. تؤكد لنا ويكيبيديا أن "إخفاء المعلومات (من اليونانية στεγανοσ - مخفي واليونانية γραφω - أكتب، حرفيًا "الكتابة السرية") هو علم النقل الخفي للمعلومات عن طريق الحفاظ على سرية حقيقة النقل.

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

في حالتنا، ستكون الحاوية عبارة عن صورة بتنسيق BMP. أولاً، دعونا نلقي نظرة على بنية هذا الملف. يمكن تقسيم الملف إلى 4 أجزاء: رأس الملف، ورأس الصورة، ولوحة الألوان، والصورة نفسها. لأغراضنا، نحتاج فقط إلى معرفة ما هو مكتوب في الرأس.

أول بايتين من الرأس هما توقيع BM، ثم يتم كتابة حجم الملف بالبايت بكلمة مزدوجة، ويتم حجز البايتات الأربع التالية ويجب أن تحتوي على أصفار، وأخيرًا، كلمة مزدوجة أخرى تحتوي على الإزاحة من بداية الملف إلى البايتات الفعلية للصورة. في ملف bmp ذو 4 بت، يتم ترميز كل بكسل بثلاث بايتات BGR.

الآن نحن نعرف كيفية الوصول إلى الصورة، كل ما تبقى هو فهم كيف يمكننا كتابة المعلومات التي نحتاجها هناك. لهذا سنحتاج إلى طريقة LSB. جوهر الطريقة هو كما يلي: نستبدل البتات الأقل أهمية في البايتات المسؤولة عن تشفير الألوان. لنفترض أن البايت التالي لرسالتنا السرية هو 11001011، والبايتات الموجودة في الصورة هي...11101100 01001110 01111100 0101100111...، فسيبدو التشفير بهذا الشكل. سنقوم بتقسيم بايت الرسالة السرية إلى 4 أجزاء ثنائية البت: 11، 00، 10، 11، واستبدال البتات ذات الترتيب المنخفض من الصورة بالأجزاء الناتجة: ...11101111 01001100 01111110…. مثل هذا الاستبدال غير ملحوظ بشكل عام للعين البشرية. علاوة على ذلك، لن تتمكن العديد من أجهزة الإخراج القديمة من عرض مثل هذه التغييرات الطفيفة.

من الواضح أنه لا يمكنك تغيير البتتين الأقل أهمية فحسب، بل يمكنك أيضًا تغيير أي عدد منهما. هناك النمط التالي: كلما زاد عدد البتات التي قمنا بتغييرها، زادت المعلومات التي يمكننا إخفاءها، وزاد التداخل الذي يسببه ذلك في الصورة الأصلية. على سبيل المثال، هنا صورتين:

إخفاء المعلومات LSB
إخفاء المعلومات LSB

على الرغم من بذل قصارى جهدي، لم أتمكن من رؤية الفرق بينهما، ولكن مع ذلك، في الصورة الثانية، وباستخدام الطريقة الموصوفة، تم إخفاء قصيدة لويس كارول “صيد السنارك”. إذا كنت قد قرأت هذا حتى الآن، فمن المحتمل أنك مهتم بمعرفة المزيد عن التنفيذ. الأمر بسيط للغاية، لكنني سأحذرك على الفور من أن كل شيء يتم في دلفي. هناك سببان لذلك: 1. أعتقد أن دلفي لغة جيدة؛ 2. وُلد هذا البرنامج أثناء إعداد دورة حول أساسيات رؤية الكمبيوتر، والرجال الذين أقوم بتدريس هذه الدورة لهم لا يعرفون بعد أي شيء آخر غير دلفي. بالنسبة لأولئك الذين ليسوا على دراية ببناء الجملة، هناك شيء واحد يحتاج إلى شرح: shl x هو إزاحة بت إلى اليسار بواسطة x، وshr x هو إزاحة بت إلى اليمين بواسطة x.

نفترض أننا نكتب نصًا مخزنًا في سلسلة نصية في الحاوية ونستبدل البايتتين السفليتين:
رمز التسجيل:

لأني:=1 إلى الطول(str) افعل
    بدأ
      l1:=byte(str[i])shr6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    الغاية؛

الكود الذي يجب قراءته:

لأني:=1 إلى MsgSize افعل
    بدأ
      f.ReadBuffer(tmp,1);
      l1:=tmpshl6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    الغاية؛

حسنًا، بالنسبة للكسالى حقًا - رابط البرنامج وكود المصدر الخاص به.

شكرا لك.

المصدر: www.habr.com

إضافة تعليق