ديفي-هيلمان: الخوارزمية العبقرية التي تؤمن اتصالات الشبكة

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

الجميل في الأمر أن هذه المشكلة قد حُلت في عام 1976 على يد ويتفيلد ديفي ومارتن هيلمان. هذه نسخة مبسطة من العالم الحقيقي، لكننا نواجه نفس المشكلة عند التواصل عبر أكبر شبكة موجودة على الإطلاق. عادةً، لا تكون متصلاً بالإنترنت مباشرةً، بل تكون جزءاً من شبكة محلية أصغر تُسمى Ethernet. يمكن أن تكون هذه الشبكة الأصغر سلكية أو لاسلكية (Wi-Fi)، لكن المفهوم الأساسي يبقى واحداً. إذا أرسلت إشارة عبر الشبكة، يمكن قراءة هذه الإشارة بواسطة جميع العملاء الآخرين المتصلين بنفس الشبكة.

رسم توضيحي لشبكة إيثرنت توضح كيفية اتصال الأجهزة وتبادل البيانات

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

التشفير: حجر الزاوية في حماية البيانات

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

من المهم أن القيمة المشفرة (ciphertext) لا يمكن فك تشفيرها إلا بالمفتاح الأصلي. يُسمى هذا النوع من الخوارزميات “خوارزمية المفتاح المتماثل” (symmetric-key algorithm) لأنك تحتاج إلى نفس المفتاح لفك تشفير الرسالة الذي تم تشفيرها به. توجد أيضاً خوارزميات المفتاح غير المتماثل (asymmetric-key algorithms)، لكننا لسنا بحاجة إليها الآن.

لتسهيل فهم هذا، إليك خوارزمية تشفير وهمية (dummy encryption algorithm) مُطبقة بلغة JavaScript:

 function encrypt ( message, key ) {
  return message.split( "" ).map( character => {
    const characterAsciiCode = character.charCodeAt( 0 )
    return String .fromCharCode(characterAsciiCode+key.length)
  }).join( "" );
 } 

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

رسم توضيحي لعملية ربط الأحرف في جدول ASCII باستخدام طول المفتاح

فك تشفير النص المشفر (ciphertext) مشابه تماماً. ولكن بدلاً من الجمع، نطرح طول المفتاح من كل حرف في النص المشفر، لنستعيد الرسالة الأصلية.

 function decrypt ( cipher, key ) {
  return cipher.split( "" ).map( character => {
    const characterAsciiCode = character.charCodeAt( 0 )
    return String .fromCharCode(characterAsciiCode-key.length)
  }).join( "" );
 } 

أخيراً، إليك خوارزمية التشفير الوهمية قيد العمل:

 const message = "Hi Bob, here is a confidential message!" ;
 const key = "password" ;
 const cipher = encrypt(message, key);
 console .log( "Encrypted message:" , cipher);
 // Encrypted message: Pq(Jwj4(pmzm(q{(i(kwvnqlmv|qit(um{{iom)
 const decryptedMessage = decrypt(cipher, key);
 console .log( "Decrypted message:" , decryptedMessage);
 // Decrypted message: Hi Bob, here is a confidential message! 

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

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

ثالثاً، لا يوجد حد أدنى لطول المفتاح. تعمل الخوارزميات الحديثة بمفاتيح لا تقل عن 128 بت (حوالي 16 حرفاً). هذا يزيد بشكل كبير من عدد المفاتيح المحتملة، وبالتالي يزيد من أمان التشفير.

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

هناك مجموعة واسعة من خوارزميات التشفير المتماثل التي عالجت جميع هذه المطالب، وغالباً ما تُستخدم معاً لإيجاد نسبة جيدة بين السرعة والأمان لكل موقف. من أشهر خوارزميات المفتاح المتماثل: Twofish، Serpent، AES (Rijndael)، Blowfish، CAST5، RC4، TDES، و IDEA.

تبادل المفاتيح: تحدي التواصل الآمن

يبدو أننا قلصنا مساحة المشكلة الأصلية. باستخدام التشفير، يمكننا إنشاء رسالة ذات معنى للأطراف المؤهلة لقراءة المعلومات، ولكنها غير قابلة للقراءة للآخرين. عندما ترغب أليس في كتابة رسالة سرية، فإنها ستختار مفتاحاً وتُشفر رسالتها به وتُرسل النص المشفر (ciphertext) عبر الأسلاك. سيتلقى كل من بوب وتشارلي الرسالة المشفرة، لكن لا يمكن لأي منهما تفسيرها بدون مفتاح أليس.

السؤال الوحيد الذي يجب الإجابة عليه الآن هو كيف يمكن لأليس وبوب العثور على مفتاح مشترك بمجرد التواصل عبر الشبكة ومنع تشارلي من اكتشاف نفس المفتاح. إذا أرسلت أليس مفتاحها مباشرة عبر الأسلاك، فسيعترضه تشارلي وسيكون قادراً على فك تشفير جميع رسائل أليس. لذا، هذا ليس حلاً. يُسمى هذا في علوم الكمبيوتر “مشكلة تبادل المفاتيح” (key exchange problem).

خوارزمية ديفي-هيلمان لتبادل المفاتيح: حل عبقري

توفر هذه الخوارزمية الرائعة طريقة لتوليد مفتاح مشترك بين شخصين بطريقة لا يمكن رؤية المفتاح من خلال مراقبة الاتصال. كخطوة أولى، سنقول أن هناك عدداً أولياً ضخماً، معروفاً لجميع المشاركين، وهو معلومات عامة. نسميه "p" أو المعامل (modulus). يوجد أيضاً رقم عام آخر يُسمى "g" أو الأساس (base)، وهو أقل من p. لا تقلق بشأن كيفية توليد هذه الأرقام. لغرض التبسيط، لنفترض أن أليس تختار عدداً أولياً كبيراً جداً (p) ورقماً أقل بكثير من p. ثم تُرسلهما عبر الأسلاك دون أي تشفير، بحيث يعرف جميع المشاركين هذه الأرقام.

مثال توضيحي: فهم ديفي-هيلمان بأرقام بسيطة

لفهم هذا من خلال مثال، سنستخدم أرقاماً صغيرة. لنفترض أن p=23 و g=5.

كخطوة ثانية، سيختار كل من أليس (a) وبوب (b) رقماً سرياً، لن يخبراه لأحد، إنه يعيش محلياً فقط في أجهزة الكمبيوتر الخاصة بهما.

مثال: لنفترض أن أليس اختارت 4 (a=4)، وبوب اختار 3 (b=3).

كخطوة تالية، سيقومون ببعض العمليات الحسابية على أرقامهم السرية، سيقومون بحساب: الأساس (g) مرفوعاً لقوة رقمهم السري، ويأخذون باقي قسمة الرقم المحسوب على p. نسمي النتيجة A (لأليس) و B (لبوب).

باقي القسمة (Modulo) هو عبارة رياضية بسيطة، ونستخدمه لإيجاد الباقي بعد قسمة رقم على آخر. إليك مثال: 23 mod 4 = 3، لأن 23/4 يساوي 5 والباقي 3. ربما يكون من الأسهل رؤية كل هذا في الكود:

 // base
 const g = 5 ;
 // modulus
 const p = 23 ;

 // Alice's randomly picked number
 const a = 4 ;
 // Alice's calculated value
 const A = Math .pow(g, a)%p;

 // Do the same for Bob
 const b = 3 ;
 const B = Math .pow(g, b)%p;

 console .log( "Alice's calculated value (A):" , A);
 // Alice's calculated value (A): 4
 console .log( "Bob's calculated value (B):" , B);
 // Bob's calculated value (B): 10 

الآن، سيرسل كل من أليس وبوب قيمتيهما المحسوبتين (A، B) عبر الشبكة، بحيث يعرفهما جميع المشاركين.

كخطوة أخيرة، سيأخذ كل من أليس وبوب القيم المحسوبة لبعضهما البعض ويقومان بما يلي:

ستأخذ أليس القيمة المحسوبة لبوب (B) وترفعها لقوة رقمها السري (a)، وتحسب باقي قسمة هذا الرقم على p وتُسمي النتيجة s (المفتاح السري).

سيقوم بوب بنفس الشيء ولكن مع القيمة المحسوبة لأليس (A)، ورقمه السري (b).

في هذه المرحلة، نجحا في توليد مفتاح سري مشترك (s)، حتى لو كان من الصعب رؤية ذلك الآن. سنستكشف هذا بمزيد من التفصيل بعد قليل. في الكود:

 // Alice calculate the common secret
 const secretOfAlice = Math .pow(B, a)%p;
 console .log( "Alice's calculated secret:" , secretOfAlice);
 // Alice's calculated secret: 18

 // Bob will calculate
 const secretOfBob = Math .pow(A, b)%p;
 console .log( "Bob's calculated secret:" , secretOfBob);
 // Bob's calculated secret: 18 

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

معادلة رياضية توضح كيفية وصول أليس وبوب إلى نفس المفتاح السري المشترك

في الخطوة الأخيرة، استخدمنا خاصية هوية حسابية لباقي القسمة (modulo arithmetic identity) وخصائصها التوزيعية لتبسيط عبارات باقي القسمة المتداخلة.

لذا، يمتلك كل من أليس وبوب نفس المفتاح، ولكن دعنا نرى ما رآه تشارلي من كل هذا. نعلم أن p و g هما رقمان عامان، متاحان للجميع. نعلم أيضاً أن أليس وبوب أرسلا قيمتيهما المحسوبتين (A، B) عبر الشبكة، لذا يمكن لتشارلي أيضاً اعتراضهما.

رسم توضيحي يوضح منظور تشارلي للمعلومات المتاحة له في عملية تبادل مفاتيح ديفي-هيلمان

يعرف تشارلي تقريباً جميع معلمات هذه المعادلة، باستثناء a و b اللذين يظلان مخفيين. للبقاء مع المثال، إذا عرف أن A هي 4 و p هي 23، فإن g مرفوعة لقوة a يمكن أن تكون 4، 27، 50، 73، … وعدد لا نهائي من الأرقام الأخرى التي تنتج 4 في فضاء باقي القسمة (modulo space). كما يعلم أن جزءاً فقط من هذه الأرقام هو خيارات ممكنة لأنه ليست كل الأرقام هي أس لـ 5 (g)، لكن هذا لا يزال عدداً لا نهائياً من الخيارات للمحاولة.

لا يبدو هذا آمناً جداً مع الأرقام الصغيرة. ولكن في البداية قلت إن p هو رقم كبير جداً، غالباً ما يكون بطول 2000 أو 4000 بت. هذا يجعل من المستحيل تقريباً تخمين قيمة a أو b في العالم الحقيقي. المفتاح المشترك الذي يمتلكه كل من أليس وبوب لا يمكن توليده إلا بمعرفة a أو b، بالإضافة إلى المعلومات التي انتقلت عبر الشبكة.

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

رسم بياني يوضح عملية تبادل مفاتيح ديفي-هيلمان باستخدام تشبيه خلط الألوان

هنا، الثوابت المشتركة p و g ممثلة بالطلاء الأصفر “الطلاء المشترك” (Common paint). الأرقام السرية لأليس وبوب (a، b) هي “الألوان السرية” (Secret colours)، و “السر المشترك” (Common secret) هو ما أطلقنا عليه s. هذا تشبيه رائع لأنه يمثل عدم قابلية عكس عملية باقي القسمة (modulo operation). فكما لا يمكن فصل الألوان المختلطة إلى مكوناتها الأصلية، لا يمكن عكس نتيجة عملية باقي القسمة.

الخلاصة التقنية

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

تُعد خوارزمية ديفي-هيلمان إنجازاً ثورياً في علم التشفير، حيث قدمت حلاً أنيقاً لمشكلة تبادل المفاتيح السرية عبر قناة غير آمنة. إن قدرتها على توليد مفتاح مشترك دون الكشف عن الأسرار الفردية للأطراف، باستخدام خصائص الرياضيات المعيارية (modular arithmetic)، هي أساس العديد من بروتوكولات الأمان الحديثة مثل TLS/SSL التي نعتمد عليها يومياً في تصفح الإنترنت الآمن. فهم هذه الخوارزمية يُعطينا تقديراً أعمق للأسس الرياضية التي تبنى عليها حماية بياناتنا الرقمية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *