التشفير هو عملية يتم فيها تحويل نص من الكلمات أو الحروف العادية إلى نص مشفر بالرموز أى تحويل نص عادي يمكن قراءته إلى رموز معقدة لا يمكن قراءتها. و في المعادلتين التاليتين توضيح أكثر لهذه العملية:
1- CypheredMessage = Encrypt (Key1, PlainMessage) --> Encryption 2- PlainMessage = Decrypt (Key2, CypheredMessage) --> Decryption
هونظام تشفير غير متماثل يكون لكل طرف فيه زوج من المفاتيح (علنى و سرى) و يتبادل الطرفان المفاتيح العلنىة فقط لكن استخدام المفاتيح السرية ضرورى لكل طرف.
و يمكن بسهولة من الناحية العملية استنتاج المفتاح العلنى من المفتاح السرى بينما يكاد يكون العكس مستحيل أو بمعنى أدق في غاية الصعوبة لذا نستطيع أن نقول أن أحد عوامل قوة التشفير هو مدى صعوبة هذه العملية.
هي عملية أخرى عن طريقها تتمكن من إدراج ما يشبه توقيعا خاصا بك فيما ترسله من رسائل و بذلك يستطيع المستقبل التأكد من أن هذه الرسالة قد أرسلت منك. كما تمكنه من التأكد من أن هذه الرسالة لم يتم العبث بها من قبل شخص آخر.
و التوقيع الرقمى يستخدم أسلوبا مشابها لالتشفير بالمفاتيح العلنية غير أنه في التشفير نستخدم المفتاح السرى الخاص بنا و مفتاح الطرف الآخر المعلن في تشفير الرسالة بينما في التوقيع الرقمي نستخدم المفتاحين السرى و العلنى الخاص بنا.
لنفرض أن لدينا شخصان أو طرفان أحمد و برعي:
و الآن يريد أحمد أن يبعث برسالة مشفرة إلي برعي لذا يستخدم توليفة من KA1 و KB2 لتشفير الرسالة بينما يستخدم برعي توليفة من KB1 و KA2 لفك هذا التشفير. أيضا يستخدم أحمد KA1 لكي يرفق بالرسالة توقيع رقمى و يستطيع برعي التأكد و مراجعة أصل الرسالة بواسطة KA2.
كلمة PGP هي الأحرف الأولى من (Pretty Good Privacy) وهي آداه طورها Phil Zimmerman تستخدم لتشفير أو إدراج توقيع برسالة أو ملف أو بريد إلكتروني بين الأطراف المختلفة تعتمد على التشفير بالمفاتيح العلنية.
كلمة GPG هى الأحرف الأولى من (GNU Privacy Guard) و هى بديل حر لPGP طوره مبرمجى مشروع GNU، ستجد نسخة من GPG فى كل توزيعات GNU/Linux
ندخل الأمر التالي
# gpg --gen-key
يسألك هذا الأمر عن نوع المفتاح الذي تريده.
في هذا المثال سوف نختار النوع الأول.
و بالمناسبة ElGamal هو نوع من التشفير تم تطويره بواسطة عالم مصرى يدعي طاهر الجمال.
بعدها يسأل عن طول المفتاح
حيث المفتاح الأطول يكون أكثر أمانا و تعقيدا و لكن أقل كفاءة و سرعة. لذا أعتقد أن 1024 هو أنسب إختيار.
بعدها يسأل عن فترة صلاحية هذا المفتاح أو المدة التي يظل فيها هذا المفتاح متاحا و قابل للاستخدام و سوف نختار 5 سنوات.
بعد ذلك ندخل ال ID بريد إلكتروني علي سبيل المثال - و ندخل بعدها كلمة سر بحيث لا يستطيع أي شخص استخدام هذا المفتاح السرى حتى ولو أتيح له استخدام هذا الجهاز.
ندخل الأمر التالي
# gpg -a --export USER_ID
حيث ال USER_ID هو ذلك ال ID الذي أدخلناه في الخطوة السابقة البريد الإلكتروني - . قم بعدها بنسخ الناتج عن هذا الأمر وضعه في أي مكان بحيث تتاح رؤيته للآخرين أو لباقي الأطراف مثل الصفحة الرئيسية علي موقعك أو أرسله لهم بالبريد الإلكتروني مع ملاحظة أن الطريقة الثانية غير آمنة.
لنفرض أن أحد هذه الأطراف هو صديق يدعي طارق حيث يمكن أن نحصل علي المفتاح العلنى الخاص به من موقعه أو بمقابلته و معرفة هذا المفتاح منه.
بعد معرفة هذا المفتاح العلنى و بصرف النظر عن طريقة الحصول عليه نضيف هذا المفتاح إلي ملف نسميه مثلا tarek_key.txt ثم ندخل الأمر التالي:
# gpg --import tarek_key.txt
ونكرر الخطوة رقم 3 لكل شخص نريد أن نضيف المفتاح العلنى الخاص به إلي قاعدة البيانات الخاصة بنا.
نلاحظ أن كل المفاتيح التي أدخلناها ليست مؤهلة بعد للإستخدام لأنها ليست في موضع ثقة (Trust) ونستطيع تعديل بعض خواص هذه المفاتيح ومنها درجة الثقة فى صحة و سلامة المفتاح عن طريق الأمر التالي:
# gpg --edit-key tarek_ID
هذا الأمر يدخلنا في واجهة تفاعلية حيث نستطيع أن نرى ال Fingerprint الخاصة بهذا المفتاح و تغيير حالته إلي Trust وأيضا إدراج توقيع رقمى.
لفحص ال Fingerprint:
>fpr
لنفرض أننا نريد التأكد من أن هذا المفتاح متاح من قبل طارق لذا فمن الممكن الاتصال به علي المحمول و نراجع معه المفتاح ولكن إذا قمت بمراجعة كل ال 1024 بت أعتقد أن فاتورة الهاتف الخاص بك سوف تزداد قليلا. لهذا السبب نستخدم مثل هذا الأمر الذي يظهر مؤشر تطابق موحد لا يتكرر لهذا المفتاح و الذي عن طريقه نتأكد من أن هذا المفتاح متاح من قبل طارق و قابل للاستخدام بدلا من مراجعة 1024 بت.
و الآن و بعد التأكد من صلاحية المفتاح نغير حالته إلي Trust عن طريق :
>trust
و نستطيع أيضا إضافة توقيع لتمييزه عن طريق:
>sign
للخروج من الواجهة التفاعلية:
> quit
# gpg --list-keys
سوف نقوم الآن بعمل تشفير و إدراج توقيع لملف. لنفرض أن الملف هو secret_list.txt و سوف نرسله إلي طارق و بالطبع لابد من وجود المفتاح العلنى الخاص به لدينا.
# gpg --encrypt -r secret_list.txt
يظهر لنا ملف باسم secret_list.gpg و لوضع توقيع عليه:
# gpg --clearsign secret_list.txt
و لعمل الخطوتان معا:
# gpg -se -r secret_list.txt
سوف نقوم الآن بفك تشفير ملف أرسل من قبل طارق. لنفرض أن اسم الملف tarek_letter.gpg و حيث أنه لدينا المفتاح العلنى الخاص بطارق:
# gpg --decrypt tarek_letter.gpg
نلاحظ هنا أنه حتى ولو كان هذا الملف مشفر و مدرج به توقيع يكفى فقط فك التشفير أما التوقيع فيتم مراجعته أوتوماتيكيا. و لمراجعة توقيع أدرج للملف tarek_letter.sig بواسطة المفتاح المعلن الخاص بطارق:
# gpg --verify tarek_letter.sig
الغرض من هذا الخادم هو جعل مفتاحك المعلن متاحة من خلال قاعدة بيانات عامة بحيث يمكن لأى شخص الحصول علي مفتاحك المعلن و استخدامه في تشفير الرسالة التي سوف يرسلها إليك من خلالها.
و رغم وجود عدد كبير من من الخوادم يمكنك إرسال مفتاحك المعلن لأحدها فقط و سوف يأخذ هذا الخادم علي عاتقه مهمة إرسال مفتاحك المعلن إلي باقي الخوادم المعروفة.
و الآن لإرسال مفتاحك المعلن لأحد هذه الخوادم أدخل الأمر التالي:
# gpg --keyserver <keyserver name> --send-key <key ID>
حيث Keyserver Name هو عنوان خادم المفاتيح
و لكي تحصل علي المفتاح المعلن لشخص آخر أدخل الأمر التالى:
# gpg --keyserver <keyserver name> --recv-keys <key ID>
مثلا
# gpg --keyserver pgp.mit.edu --recv-keys B79C3C77
كما ذكرنا سابقا تستطيع الآن الإتصال بأى خادم و الحصول علي المفتاح المعلن لأي شخص تريده عن طريق الأمر السابق. و لكن كيف يمكن أن تتأكد من أن هذا المفتاح هو فعلا المفتاح المعلن الخاص بهذا الشخص؟
لو أننى قمت بالحصول علي مفتاح علاء المعلن من أي خادم من خوادم المفاتيح المعلنه المعروفه. كيف لي أن أتأكد من أن هذا المفتاح هو فعلا المفتاح المعلن الذي أرسله علاء شخصيا و ليس أي شخص آخر حيث أنه و بكل بساطه يستطيع أي شخص إرسال أي مفتاح باسم علاء. و من هنا جاءت فكرة توقيع المفاتيح.
لنفرض أنني أثق في مفتاح علاء المعلن و أنت تثق في المفتاح المعلن الخاص بي و لكنك لا تثق في مفتاح علاء المعلن. لذا من الممكن أن أوقع أنا علي مفتاح علاء و إعادة إرساله إلي الخادم و عندما تحصل أنت علي مفتاح علاء و تجد عليه توقيعي سوف تثق به.
لكي تضع توقيعك علي مفتاح شخص ما أدخل الأمر التالي:
# gpg --sign-key <key ID>
و كما تلاحظ فالمسألة كلها تعتمد علي الثقه حيث أنه يجب أن تثق في مفتاح واحد علي الأقل و من هنا جاء التعبير (حلقة الثقه) حيث يجب أن تثق في {س} لكي تثق في {ص} و تثق في {ص} لكي تثق في {ع} ...... إلخ الى أن نعود الى {س}
من الواضح الآن مدى أهمية ال PGP و إصداره الحر GnuPG كآداة تتيح لنا سلامة و خصوصية البيانات, و البيانات هنا ربما يقصد بها ملفات نصوص أو كود.
كثير من المبرمجين الآن يفضلون توقيع الكود الذى يكتبونه بواسطة مفتاح التشفير الخاص بهم لذلك إذا أراد شخص ما الحصول على هذا الكود أو البرنامج حتى و لو كان من مكان آخر غير الصفحة الرئيسية الخاصة بهذا المبرمج الذى كتب الكود, يمكن ببساطة التأكد من أن هذا الكود :تبه فعلا هذا المبرمج كما يمكن التأكد من أن لم يتغير كما ذكرنا سابقا.
ربما تلاحظ في كثير من مواقع البرامج ذات المصادر المفتوحة على سبيل المثال www.kernel.org يوجد ملف إسمه kernel-2.x.x.tar.gz و بجانبه ملف آخر إسمه kernel-2.x.x.tar.gz.sign و الذى يعد نفس الملف الأول و لكنه موقع بواسطة المبرمج أو مجموعة المبرمجيين الذين أصدروه.
و فى النهاية أنصحك بتعلم استخدام آداة ال GnuPG إذا كنت تريد البقاء آمنا وسط عالم الإنترنت الغير آمن
بعد كل الكلام "المعقد" السابق -لقد قرأته 3 مرات لأفهم ما هذا ;)- سنتحدث عن طريقة بسيطة للقيام بكل الأشياء السابقة باستخدام الواجهة الرسومية
اذا كنت من مستخدمى بيئة سطح المكتب كى دى اى فستجد أداة جميلة تسمى Kgpg (يمكن الوصول اليها من "القائمة الرئيسية --> أدوات خدمية --> Kgpg"، أو من سطر الأوامر kgpg)، وهى عبارة عن واجهة سهلة الإستخدام لأداة GnuPG.
مع Kgpg لن تحتاج لتذكر أوامر GnuPG وخيارات سطر الأوامر، حيث يمكمنك عمل كل شئ ببضع نقرات من الفأرة.
عند تشغيل Kgpg لأول مرة فسيظهر لك مربع حوار انشاء زوج مفاتيح تشفير (أو يمكنك اختياره من قائمة "المفاتيح --> توليد زوج المفتاح" من داخل نافذة Kgpg الرئيسية)، حيث يمكنك ادخال بياناتك ثم اضغط موافق واتبع التعليمات حتى يتم انشاء مفتاحى التشفير.
من النافذة الرئيسة لـ Kgpg انقر بالزر اﻷيمن على المفتاح المراد ثم اختر "Export Puplic Keys" من القائمة المنبثقة.
!3-استيراد مفتاح: لتضيف المفتاح العلنى -الخاص بأحد أصدقائك مثلا- اذهب الى النافذة الرئيسة لـ Kgpg ثم قائمة "المفاتيح --> استيراد مفتاح" ثم لتغيير حالة المفتاح الى مفتاح موثوق"Trust" انقر بالزر اﻷيمن على المفتاح واختر "تحرير مفتاح" حيث يمكنك فحص البصمة والتأكد منها من مالك المفتاح وبعدها يمكن تعيين المفتاح كمفتاح موثوق به.
هناك عدة طرق لتشفير ملف باستخدام Kgpg:
أما بالنسبة لمستخدمين أسطح المكتب الأخرى غير KDE فيمكنكم العثور على برامج واجهه رسومية للتعامل مع GPG في الصفحة التالية: