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

TL ؛ DR - اختراع آلية مصادقة المستخدم باستخدام إخفاء المعلومات لوكالة وهمية من ثلاثة أحرف لبلد غير موجود.
حول الذئاب وجلود الغنم
الغلاف عبارة عن غطاء ، لذلك لا ينبغي أن يثير أليس ولا بوب أي شك في أي من تصرفاتهما. التخطيط السليم ينطوي على جنون العظمة حول المراقبة المستمرة لها على جميع المستويات الممكنة. لن يعالج هذا المنشور مهمة التبادل المباشر للمعلومات (يستحق سلسلة منفصلة خاصة به) ، ولكن فقط وسيلة للتأكد من أن يتم إرسالها من قبل أولئك الذين يحتاجون إليها لمن يحتاج إليها.
على الأرجح ، سيكون لكلا الجواسيس تاريخ في شكل المواطنين العاديين ، علاوة على ذلك ، لا يرتبط أي منهما بأي شكل من الأشكال. لذلك ، يتعين عليك على الفور استخدام حق النقض (الفيتو) ضد استخدام أدوات التشفير الكلاسيكية والقنوات الآمنة - يعرف كل عميل مكافحة التجسس أن الأشخاص الشرفاء الذين ليس لديهم اتصال وثيق ليس لديهم ما يخفيونه.
ما يجب القيام به
بالطبع ، هذه المهمة ليست جديدة ، فقد كانت موجودة لحسن الحظ وتم حلها قبل وقت طويل من ظهور هذه الإنترنت الخاص بك. ولم يتم تحديد ذلك فحسب ، لذلك تم تعزيز بعض القرارات في الثقافة وما زالت موجودة في الكتب والأفلام والألعاب.
دعونا نلقي نظرة على مثل هذا المشهد: يلتقي شخصان يرتديان معاطف طويلة في مكان عام ويتبادلان عبارات غريبة للغاية. إذا كانت العبارة الأولى والجواب صحيحين ، فكانت المصادقة ناجحة ، وتبادل الأشخاص المجلدات "سري للغاية" وتتباعدوا في اتجاهات غير معروفة.
إن عيب هذا المخطط واضح على الفور - يجب أن تبقى العبارات سرية وتغييرها في كثير من الأحيان ، وهي ليست بسيطة للغاية في أراضي العدو. في الوقت نفسه ، حتى لا يتم التصريح عن طريق الصدفة ولا يؤدي إلى حالة KDPV ، فإنها تصبح بارزة وعشوائية للغاية ، مما يعني أنها يمكن أن تعطي الوكلاء الذين ينطقون بها.

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

إخفاء المعلومات (مرة أخرى؟)
القنفذ من الواضح أن القدرة على إخفاء بعضها البعض في مثل هذا الموقف تبدو أكثر جاذبية من أي وقت مضى. وفي الحقيقة ، حتى الطريقة الموصوفة هي أنواعها الفرعية - يمكن اعتبار عبارات الأكواد حاويات تحتوي على جزء واحد فقط من المعلومات.
إن نفس الثدييات في مفرزة الحشرات تدرك أن الأمر لا يتعلق بمجرد إلقاء بعض مضادات الإلتهاب على بعضهما البعض. سيؤدي هذا التبادل إلى مزيد من الشكوك تقريبًا عن بعض تشفير PGP الشائع ، لذلك نحن لسنا مهتمين.
ماذا عن ذلك؟
على عكس cryptograms ، فإن stegocontainers لديها ميزة واضحة - سياق التطبيق. أي نص أو صورة أو ملف صوتي ، وما إلى ذلك ، بالإضافة إلى المحتوى الواضح ، يحمل أيضًا إمكانية مناقشته الطبيعية ويمكن إرساله ليس فقط من الخليج ، ولكن في عملية حوار لا يسبب الشك.
مسلحًا بمثل هذه الأفكار فقط ، يمكننا بالفعل إعداد بروتوكول مصادقة ستيغانوغرافي بسيط يستند إلى مفتاح مشترك:
- A -> B: رسالة جميلة تطلب حاوية معلومات مختصرة ذات معلمات معينة ؛
- B: تحديد الحاوية C التي تطابق السياق والمعلمات المطلوبة ؛
- B: وبالمثل يخلق رسالة M ؛
- B -> A: C '= Embed (C، M، K) ؛
- a: الشيكات c ' للامتثال المعلمات مجموعة؛
- A -> B: M '= استخراج (C' ، K) ؛
- ب: يتحقق إذا تطابق M و M.
مثل هذا البروتوكول له عيوب واضحة - يجب أن يكون لدى Alice و Bob وظائف مشتركة ومضمنة واستخراج. قد يؤدي حل وسطهم إلى إمكانية إجراء تحليل تفصيلي لطريقة المصادقة للعدو وتعريض المستخدمين الآخرين والمقر الرئيسي للخطر. شيء يحتاج إلى إصلاح.
الفنان ليس خطأ
إذا ذهب القارئ إلى المدرسة بعد ظهور فصول الكمبيوتر ، فعليه أن يتذكر تعلم أساسيات الخوارزمية باستخدام مؤثر السلحفاة والنمل وما شابه. كانت فكرتهم هي إظهار إمكانيات تحسين عدد كبير من الإجراءات الفردية اليدوية من خلال إنشاء برامج بسيطة. لحل مشكلتنا ، نحتاج أن نسير في الاتجاه المعاكس.

نظرًا لأنه يمكننا تبسيط كتابة الخوارزمية النهائية من تسلسل الخطوات إلى وصفها الإجرائي وفقًا للمعايير المحددة ، يمكننا تنفيذ العملية العكسية. إذا كنت تتخيل حاوية كصفيف لبعض مكوناتها ، فيمكن كتابة دمج رسالة حسب المفتاح كسلسلة متسلسلة من العمليات على عناصر الحاوية في مؤشرات محددة بمختلف المعلمات الثابتة.
هذا هو المكان الذي تبدأ فيه الرياضيات غير ، لذلك أطلب من الخجول أن ينقلب ببساطة من خلال الفقرات الصعبة إلى قسم العمليات أو حتى أبعد من ذلك بقليل. لن يحدث شيء فظيع ، أعدك.
لتضمين البيانات ، نحتاج إلى تسلسل من النموذج: (f1 ، S1 ، i ، D1) ، (f2 ، S2 ، j ، D2) ... ، حيث:
- دي - جزء من البيانات المدمجة ؛
- i ، j هي مؤشرات عناصر الحاوية ؛
- fi: (الحالة ، العنصر ، D) -> (الحالة ، العنصر) - وظيفة التضمين ؛
- Si هي حالة معينة ، سياق العملية ، (El '، S [i + 1]) = fi (Si، El، Di) .
لاستخراجها ، لا تحتاج إلى تخزين أجزاء من البيانات (K.O.) ، وبالتالي هناك ثلاث مرات كافية: (g1 ، S1 ، I1) ، (g2 ، S2 ، I2) ... بنفس القيم ، فقط gi: (الحالة ، العنصر) -> (الدولة ، د) .
كل هذا يمكن أن يمثله الرسم البياني المتماثل أدناه. إذا لم أتمكن من الوصول إلى الوضوح لسبب ما ، فهذا ليس مخيفًا ، فما عليك سوى قراءة.

يمكن ملاحظة أن وظيفة التضمين بها عدد أكبر من درجات الحرية. على عكس أختها ، تقوم بتعديل الحاوية ، أثناء القيام بذلك على أساس عنصرين مستقلين - البيانات المضمنة والعنصر. شكرًا ، أو بشكل أكثر دقة ، بسبب ذلك ، يمكن استخدام نهجين عالميين في تنفيذ خوارزمية إخفاء المعلومات بواسطة مثل هذا النظام:
- اختر أنسب مؤشرات العناصر المراد تغييرها وفقًا لدالة التضمين (الأقل ملاحظتها أو لا تتطلبها على الإطلاق) ونقل التسلسل المكوّن المرتبط بحاوية معينة. مع هذا النهج ، يجب عزلهم عن بعضهم البعض قبل الحاجة إلى التضمين باستخدام الأساليب الكلاسيكية مثل التشفير والوسائط الآمنة الأخرى ؛
- ابحث عن طريقة لتقسيم الحاوية إلى عناصر ووظيفة التضمين بحيث يكون أي تغيير متوقع بها غير مرئي على حد سواء. في هذه الحالة ، يكون التسلسل مستقلًا عن الحاوية ويمكن إنشاؤه حتى بواسطة مولد عشوائي تمامًا. أقل مرونة وعدم السيطرة على أسوأ الحالات تذهب. من ناحية أخرى ، فإن هذا النهج أبسط وأكثر ملاءمة عند تطبيقه في الحقل ، لذلك أدناه سأستخدمه.
إذا لم تكن الحالة مطلوبة للخوارزمية ، فسيظل كل ما سبق صالحًا ، وذلك ببساطة بدون خطاب واحد وحظر على المخطط. بدونها ، سيكون الأمر أسهل ، في الواقع.
ولماذا نحتاجها؟
الآن ، إذا كنت تعرف مقدمًا الحاويات التي سيتم استخدام الرسائل والمفاتيح بها ، بدلاً من الكشف الكامل عن أجزاء الخوارزمية ، يمكنك إنشاء وكلاء وإعطاءهم لاستخدامهم فقط مثل هذه التسلسلات ومترجم فوري لهم. حسنًا ، حسنًا ، ليس فقط ، بالطبع ، ولكن المزيد حول ذلك لاحقًا.
أضف عدم تناسق
حتى فنان السلاحف يمكنه رسم مربع بمئات من الطرق المختلفة ، ببساطة تغيير ترتيب العمليات وإضافة طرق جديدة. هذا يعني أنه لا أحد يزعجنا ويفعل الشيء نفسه بالتسلسلات الموصوفة لبيانات الإدخال الثابتة.
وهذا يعني أنه يمكننا أخذ تسلسل التضمين وإضافة عمليات جديدة ومزجها جميعًا ، وبذلك تظل النتيجة كما هي. ما لم يكن ، في حالة وجود دولة ، سيكون من الضروري تتبعها وإضافة التغييرات الضرورية على التسلسل بشكل منفصل. هذا هو السبب في أنه بدون ذلك أسهل ، نعم.
بشكل أو بآخر ، بعد مثل هذا العجن والضوضاء ، لن يتمكن القائد نفسه بعد الآن من فهم ما يقوم بتضمينه بالفعل: أي تسلسل من عمليات N سيمثل N! يمكن أن تكون جزءا لا يتجزأ من الرسائل - واحدة لكل التقليب من الأجزاء المدمجة. في الوقت نفسه ، N نفسها سؤال كبير. لذلك ، يمكن للمرء استدعاء مثل هذه التسلسلات مفتوحة - فهي لا توفر أي معلومات سواء عن الرسالة المضمنة أو عن الخوارزمية والمفتاح المستخدم.
عند استخراج المعلومات ، من المهم للغاية بالنسبة لنا الترتيب (لاستعادة نفس الرسالة الصحيحة من كل ما هو ممكن) وعدد الأجزاء التي سيتم استخراجها ، لذلك تبقى تسلسل الاستخراج دون تغيير منذ لحظة الولادة. نظرًا لأنها تحتوي ضمنيًا على معلومات حول المفتاح والمولد والخوارزمية المستخدمة ، فإنها ، مثل الحيوانات من الكتاب الأحمر ، تحتاج إلى تخزينها وحمايتها. واحتفظ بها سرا.
ما علاقة التباين به؟ الحقيقة هي أنه الآن يرتبط كل تسلسل استخراج بعدد غير محدود من التضمين. واستعادة واحدة من الأخرى ، في الحالة العامة ، مهمة غير قابلة للذوبان.
نحن نعمل
ننسى أي الرياضيات القريبة والعودة إلى المهمة الأصلية - كيف يمكننا إرسال أليس وبوب إلى أراضي العدو من أجل:
- لم يعرفوا وجوه بعضهم البعض
- ليس لديه خوارزميات سرية في متناول اليد
- ولكن هل يمكنك التحقق من بعضهما البعض أثناء الاتصال على قناة مفتوحة؟
حسنًا ، مع الفقرة الأولى ، كل شيء واضح ، نحن لا نعطيهم أي معلومات واضحة عن بعضهم البعض ، ولا توجد مفاتيح مشتركة. للمرة الثانية ، تحتاج إلى تذكر وصف البروتوكول أعلاه. الآن يمكننا أن نستبعد مباشرة خوارزميات التضمين والاستخراج التي تمثل أسرار الحالة المحتملة وكل ذلك. ومع أخذ هذا في الاعتبار ، بالنسبة للثالث ، من الممكن إعداد بروتوكول من مرحلتين.
إنشاء معلومات المصادقة قبل بدء المهمة مع المقر الرئيسي كطرف موثوق به من ترينت:
- T: يختار الخوارزمية السرية والمفتاح السري K ، ينشئ بمساعدة من:
- استخراج تسلسل السابقين .
- مناسبة للمصادقة (أدناه) سياق Ctx ؛
- T -> A: Ctx، Ex ؛
- T: باستخدام Ex والسياق الذي تم إنشاؤه ، يولد:
- الرسالة M غير المستخدمة مسبقًا للعوامل المحددة من بين الأجزاء | Ex | .
- تسلسل لمرة واحدة لـ Em ، مما يجعله مفتوحًا كما هو موضح أعلاه ؛
- T -> B: Em ، ينشئ h (M) ، إذا رغبت في ذلك ، مجموعات إضافية.
وبالتالي ، ليس لدى Alice سوى تسلسل واحد لجميع المناسبات وسياق الاتصال المستقبلي ، ويصبح Bob المالك السعيد لمجموعة من التتابعات لمرة واحدة وتجزئة الرسائل التي قاموا بتضمينها.
يبدو بروتوكول المصادقة بالفعل أثناء المهمة كما يلي:
- A -> B: رسالة مراسلة فورية تستند إلى سياق Ctx مع وصف للحاوية ؛
- B: تحديد C ~ IM المناسب ؛
- B -> A: C '= Em (C) ؛
- ج: يتحقق من الامتثال لـ C '~ IM (نظرًا لأن التغييرات غير مرئية ، يجب حفظها) ؛
- A -> B: M '= Ex (C') ، علامات M 'كما هو مستخدم ؛
- B: الشيكات ، h (M ') == h (M) ، يدمر Em ، h (M) .
سوف يلاحظ القارئ اليقظ أنه قبل البروتوكول ، لدى أليس وبوب مجرد مجموعة من المعلومات ، والتي في حد ذاتها لا تعني أي شيء لهم ، ولا لخصم محتمل ، وخلال "اللعب بالألوان" فقط.
يتم استخدام كل مجموعة مفتوحة من بوب مرة واحدة فقط ، والتي يتم التحكم فيها بواسطة الخطوة قبل الأخيرة من أليس. عندما تقابل شخصًا سابقًا M (وبالتالي ، غير مرئي من قبلها) من قِبل شخص آخر ، تدرك أن أحد "شركائها" هو مزيف.
الاستخدام المتكرر من قبل نفس الشخص يخبرها بأنها ليست على علم بتعقيدات البروتوكول وأنها بالتأكيد ليست هي التي اتصلت بها. حسنا ، متأخرا أفضل من ألا تأتي أبدا.

حسنًا ، هكذا تبدو الأمور معقدة وغير مفهومة. هل حصل أحد هنا؟
دعنا نوضح ذلك بشكل أفضل في الممارسة ، لأنه حتى الجواسيس أنفسهم لا يحتاجون إلى معرفة تفاصيل البروتوكول للاستخدام ، ناهيك عن القراء الفقراء. في البداية فقط قليلا عن كيفية تنفيذها.
التكنولوجيا العالية
لذلك ، يبقى فقط لكتابة كل ما هو ضروري للبروتوكول. حسنًا ، لا تفعل كل شيء بيديك (رغم أنك تستطيع). واليوم سيكون ضحية الكود الخاص بي ... الغزل عجلة الحظ ... جافا؟ حسنًا ، حسنًا ، في الوقت نفسه سيكون كل شيء في المحكمة الخاصة بلبنان ، لن يتعين عليك البحث عن أي شيء.
لنبدأ مع API المطلوبة. للعمل ، تحتاج فقط إلى تحديد فئة صفيف عناصر الحاوية مع القدرة على تلقي وتغيير العناصر حسب الفهرس:
class MyContainer implements StegoContainer<MyElement> { public MyElement get(int i) {
يتم تقليل الاستخدام الإضافي لإنشاء غلاف لأتمتة إخفاء البيانات على الحاوية اللازمة وتزويد وظائف التضمين والاستخراج لمدخلاته:
StegoMachine<MyState, MyElement> myMachine = new StegoMachine( initialState, new MyContainer<MyElement>() ); final StegoEmbed myEmbed = (st, el, dp) -> {
يتم استخدام الفئات ذات اللاحقة Stateless بالطريقة نفسها ، إذا كان تطبيق الخوارزمية لا يتطلب الحفاظ على الحالة الداخلية.
يمكن للمولدات التسلسلية العمل كما تريد وليس لديها واجهة برمجة تطبيقات مشتركة. في الحالة العامة ، يمكن أن يكون أي شيء جزءًا من البيانات بشكل عام ، بدءًا من البت الوحيد إلى الفن الصخري في ترميز منفصل.
مثال التنفيذ
حول الطريقة
كمثال للتنفيذ ، باستخدام واجهات تم إنشاؤها ، قمت بتنفيذ خوارزمية بسيطة من عائلة LSB لصور نقطية ذات ضغط بدون فقد. عناصرها عبارة عن وحدات بكسل لا تحتوي على جيران في الجزء الأقل أهمية من جميع مكونات RGB. تعمل وظيفة التضمين مع وحدات بت واحدة من البيانات المصدر وتغيير ببساطة بت ترتيب منخفض من قيمة أحد المكونات (التي سوف يشير الفهرس إلى).
إنه أمر بسيط للغاية ، ولكنه أمر رائع لتنفيذ البروتوكول ، حيث إن تغيير أي عنصر أمر غير محسوس على حد سواء وفقًا لاختياراتهم ، وبالتالي يتم إنشاء مؤشرات العناصر المراد تغييرها باستخدام مولد عشوائي. في حالة Java ، باستخدام SecureRandom ، ولكن إذا رغبت في ذلك ، فإنه يتغير بسهولة إلى مصدر إنتروبيا.
ومع ذلك ، فهذه طريقة بسيطة للغاية ، لا أوصي باستخدامها إلى جواسيس حقيقيين.
حول التجزئة
نظرًا لأن النص يميل إلى التشويه اعتمادًا على الهوية المحاكية للوكيل (لا يضع البعض أحرفًا كبيرة ، والبعض الآخر يضع الرموز ، وما إلى ذلك ، والأميون بشكل عام) ، أقترح استخدام sha256 لحساب التجزئة ، ولكن فقط من الكلمات المطبوعة التي هي صغيرة:
h("Hello world?...") == h("hello, world!11")
عن واجهة
تتكون حزمة البرنامج من جزأين - أحدهما لإنشاء تسلسلات وأخرى تجزئة لـ Trent ، والآخر لتضمين وفحص الرسائل المستلمة للتأكد من توافقها.
يحدث العمل مع كليهما من سطر الأوامر من خلال الوسائط ودفق إخراج المدخلات ؛ لم يتم تسليم واجهات أخرى (الخوف والرعب). لا يزال ، ليكون هذا الموظف في المقر ، أن الجاسوس - يعني أن يكون لديك نوع من التأهيل. حسنًا ، إن لم يكن كذلك ، سأظل أضرب مثالًا على ذلك.
ماذا يفعلون جميعا؟
بادئ ذي بدء ، يحتاج Trent في المقر إلى معرفة معلومات المصادقة. على وجه الخصوص ، للتفكير مقدمًا في موقف يعمل فيه الوكلاء.
على سبيل المثال ، دع بوب يكون رسامًا مستقلًا وأليس عميله. ستتم المصادقة تحت ستار أمر لإنشاء رسومات / تصميم / شيء آخر.
نقوم بالإبلاغ عن هذه المعلومات المفيدة والعودة إلى البروتوكول نفسه. سنقوم بإعداد رسالة مضمن ملائمة لـ M.txt مسبقًا ، مع تقليل عدد الأحرف الموجودة فيها: "يناسبني جيدًا أين يمكنني تحويل الأموال." قم بإنشاء Em و Ex باستخدام الأداة المساعدة لـ Trent:
Trent@HQWorkstation:~$ java -jar HQUtil.jar -ex $(stat -c%s "M.txt") 4096 > Ex.txt Trent@HQWorkstation:~$ cat Ex.txt | java -jar HQUtil.jar -em "$(cat M.txt)" 0.25 4096 > Em.txt Trent@HQWorkstation:~$ cat M.txt | java -jar HQUtil.jar -h > hash.bin
هنا $(stat -c%s "M.txt")
تُرجع حجم الرسالة بالبايت ، و 4096 - القيود المفروضة على نطاق الفهارس التي تم إنشاؤها (للسماح باستخدام حاويات أصغر). وبالمثل ، $(cat M.txt)
استخدام $(cat M.txt)
لتمرير الرسالة نفسها إلى معلمة سطر الأوامر. من حيث المبدأ ، يمكنك الاستغناء عن bash ، باستخدام العمل اليدوي الخاص بك ، ولكن مع من هو أكثر ملاءمة.
يتم تمرير Ex.txt إلى Alice و Em.txt و hash.bin إلى Bob. تخيل الآن أن الوكلاء قد نجحوا في النشر ويريدون التواصل مع بعضهم البعض - ننتقل إلى تنفيذ البروتوكول. يضع بوب سيرته الذاتية أو عرض العمل في بعض التبادلات ، وتبدأ أليس التواصل:
: , %_% : , . ? : ,
يبحث بوب عن صورة لمظلة ، وربما يرسمها بنفسه ، إذا كانت الروح مبدعة ، يضغط / يفرض علامة مائية قليلاً (أو ما يفعله المستقلون هناك الآن) ويفعل ما يلي:
Bob@PC:~$ cat Em.txt | java -jar SpyUtil.jar -e umbrella.png
بعد الانتظار لفترة من الوقت ، يتظاهر بالعمل ، وإذا لم يفعل ذلك في الواقع ، فإنه يرسل أليس الحاوية المستلمة ، بشكل طبيعي ، مع مراعاة السياق:
: , ,
ينقل مظلة مع رسالة ، 670 كيلو بايت وهذا بدوره يسترجع الرسالة المخزنة داخليًا:
Alice@PC:~$ cat Ex.txt | java -jar SpyUtil.jar -e umbrella.png
يحول مجموعة من الكلمات إلى جملة عادية ويرسلها إلى بوب:
: , , ?
يتحقق من دقة الرسالة:
Bob@PC:~$ java -jar SpyUtil.jar -c hash.bin ", , ?" , , ? - Correct
ويستمر التواصل السهل ، إذا كان كل شيء على ما يرام. يبدو الحوار الكامل من جانب المراقب شيئًا مثل هذا:
من الواضح أن مكافحة التجسس لن تجد أي شيء مشبوه في كل هذا الاعتراض. في الواقع ، لن يتم تطبيق أساليب تحليل الحالة في هذه الحالة دائمًا - حسنًا ، طلب شخص ما صورة مظلة لمدة 5 دولارات ، فوجدوا شيئًا يفاجئ الإنترنت به. موارد الحوسبة والناس ليسوا بلا نهاية للتحقق من كل هذه الحالات. المصادقة كانت ناجحة ، الستار.
-> جيثب