OpenPGP هو معيار (Standard) تشفير مستخدم بشكل واسع لتشفير الملفات و الرسائل, و لتوقيعها إلكترونياً (Digital signing) يستخدم عدة طرق, من ضمنها طريقة المفتاح العام (Public-key cryptography).

[caption id="attachment_130785" align="aligncenter" width="575"]PGP diagram

الجزء النظري

نشأ معيار OpenPGP من برنامج PGP (Pretty Good Privacy), الذي كتبه Phil Zimmermann عام 1991, و وزعه مجاناً على الإنترنت مرفقاً بالـ Source-code. كان هدف Zimmermann توفير الحماية و الخصوصية للمستخدمين المعرضين للخطر على الإنترنت, نتيجة ً للتحرش أو التهديد الحكومي لهم. تعرض Zimmermann للمضايقة من قبل الحكومة الأمريكية, و فتحت تحقيقاً جنائياً لأنه خالف أمر منع تصدير الذخيرة بدون إذن, و الذي يعرف طرق التشفير التي تستخدم مفاتيحاً أكبر من 40-bit كذخيرة (لأن PGP استخدم مفاتيح حجمها 128-bit على الأقل). قام Zimmermann بإنشاء شركته, عام 1996 بعد إغلاق التحقيق لترعى البرنامج. قامت الشركة بالاندماج مع Viacrypt, و صار اسمها PGP Inc. بعد ذلك.

واجهت الشركة الجديدة بعض المشاكل مع شركة RSADSI التي قامت قبل دمج الشركتين بإعطاء Viacrypt رخصة ً لاستخدام RSA, و ادعت أن الرخصة لا تنطبق على الشركة المدمجة (قامت الشركة لاحقاً عام 2000 بنشر RSA كـ Public domain). لذا قام فريق العمل باعتماد خطة ٍ غير رسمية بعدم استخدام الخوارزميات (Algorithms) التي فيها صعوبات ترخيص. و عام 1997 تقدمت الشركة باقتراح لـ IETF بإنشاء معيار اسمه OpenPGP, و التصريح باستخدام اسم OpenPGP للمعيار و أي برنامج يلتزم به. جاء هذا بعد إنتشار PGP و رغبة كتاب البرامج بإنشاء برامج متوافقة مع PGP 5 (الذي نشره Zimmermann و فريقه, و ليس PGP Inc. و اسمه الأصلي PGP 3), مما دفع Zimmermann إلى القناعة بضرورة وجود معيار مفتوح لتشفير PGP.

قام Werner Koch عام 1999 بنشر برنامجه GnuPG (GNU Privacy Guard) المعروف اختصاراً بـ GPG, و هو جزء من مشروع GNU كبديل حر لـ PGP. يلتزم GPG بمعيار OpenGPG, و يمكن لكل البرامج التي تلتزم بالمعيار التعامل مع بعضها.

يجب تلخيص الأسماء المختلفة, لأنها تسبب الالتباس. PGP هو البرنامج الذي تملكه حالياً شركة Symantec, و منه اشتق OpenGPG؛ المعيار المفتوح للتشفير. GPG هو برنامج آخر يستخدم OpenGPG. يستخدم اسم PGP أحياناً للدلالة على نوع التشفير (الذي هو في أغلب الأحيان OpenGPG في الحقيقة).

كيف يعمل تشفير PGP؟

عالم التشفير علم يدعى Cryptography, و هو علم واسع يعتمد على المشاكل الرياضية التي لا يمكن حلها (عندما يقال لا يمكن حلها, يقصد بذلك لا تحل باستخدام الهاردويير المتوفر في وقت معقول. عندما يكتشف حل يسمى هجوماً “Attack”, حتى لو كان الحل نظرياً لا يمكن تطبيقه). لذا فهو يتطلب فهماً لعلم الرياضيات, و يعتمد مبادئ كثيرة لطرق التشفير المختلفة. لن أفصل في الـ Cryptography لأن هذا الموقع ليس موضعها, كما أنني لم أنهي فهم الـ Cryptography النظرية و لا أفهم المشاكل الرياضية المعقدة المستخدمة في كثير منها.

يقوم برنامج التشفير بعدة عمليات لا يراها المستخدم, و لكن ما يراه المستخدم هو كلمة السر, المفتاح السري, و المفتاح العام. هذه الجزئية أو الطريقة تدعى Public-key cryptography.

تعريفات

  • Cipher

[caption id="attachment_130786" align="aligncenter" width="266"]Euclid flowchart By Somepics (Own work) [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons[/caption]

  • : النص أو البيانات المدخلة في الخوارزمية بغرض تشفيرها تدعى Plaintext, بينما يدعى المخرج المشفر بـ Ciphertext. إذا كان التشفير صحيحاً, و كانت الخوارزمية آمنة, فلن يفك Ciphertext إلى Plaintext إلا بالخطوات التي تحددها الخوارزمية لذلك.
  • Key: معطى يحدد قبل قيام الـ Cipher بالتشفير يحدد المخرج (يمكن أن يكون كلمة سر أو يحسب من كلمة سر, أو بيانات عشوائية محفوظة في ملف, إلخ. بدون المفتاح لا يمكن تنفيذ التشفير أو فكه. يقاس حجم المفتاح بالـ bit. حجم المفتاح الأكبر لا يعني بالضرورة زيادة الأمان. يقاس مدى أمان التشفير بالـ bit أيضاً, و هو أسرع طريقة معروفة (نظرياً أو مطبقة) لكسر التشفير حسب تعقيد الهجوم (Complexity) 2n (و يعني هذا أسرع من Brute force). و يقال في هذه الحالة أن قوة التشفير هي n-bit.
  • : يستخدم هذا الاسمان لتسهيل الفهم و الشرح في مجال التشفير. تكون Alice عادة ً هي المرسل, و Bob هو المستقبل.
  • Symmetric encryption: و تدعى أيضاً Symmetric-key cryptography, يمكن ترجمتها إلى التشفير المتماثل, و تعني أن نفس المفتاح المستخدم للتشفير يستخدم لفكه (مثل التشفير باستخدام كلمة سر, ثم فك التشفير بنفس الكلمة).
  • Asymmetric encryption: و تشتهر بـ Public-key cryptography (أو Pubkey اختصاراً), و هي عكس التشفير المتماثل. يكون للمستخدم (و اسمه Bob مثلاً) مفتاحاً عاماً (Public-key) يمكن للمستخدمين الآخرين (كـ Alice) تشفير الرسائل المرسلة إليه, ثم يستخدم Bob مفتاحه الخاص (Private-key) لفك تلك الرسالة (و لا يستطيع أحد فكها غيره, حتى من شفرها).
  • Hash function: تدعى بالعربية "دالة تشفيرية". تستخدم الدالة (Function) لحساب سلسلة من البيانات تعبر عن المدخل, و لكن لا يمكن استنتاج المدخل من خلالها. يسمى المخرج Hash, و هذا الـ Hash هو مجموعة من الحروف و الأرقام العشوائية و لا يمكن عكسها لحساب المدخل. لا يمكن أن يتطابق الـ Hash لرسالتين مختلفتين (مما يعني أن الـ Hash فريد). تستخدم للتحقق من صحة الرسائل (إذ أن أي تغيير في الرسالة سيغير الـ Hash), و للتحقق من كلمات السر (يفترض أن تستخدم كل المواقع و التطبيقات التي تخزن كلمات السر هذه الطريقة, و لكن لا يحدث هذا دائماً. إذ لا يجب أن يقوم الموقع بقراءة كلمة السر مباشرة من ملف أو قاعدة بيانات و يقارنها بكلمة السر المرسلة عبر الموقع, بل عند التخزين يجب أن يقوم بحساب و تخزين الـ Hash لها دون تخزين الكلمة نفسها, ثم عند إدخالها في المرات المقبلة يقوم الموقع بحساب الـ Hash للكلمة المدخلة و يقارن الناتج مع الـ Hash المخزن), و للتحقق من صحة الملفات (و يدعى الـ Hash في هذه الحالة Checksum), و غير ذلك. من الأمثلة المشهورة المستخدمة هي الـ Magnet URI في الـ P2P (و هو MD4 hash).

أمثلة:

Cipher: من أشهر الخوارزميات المستخدمة خوارزمية Rijndael المستخدمة في نظام AES. هناك أمثلة أخرى قوية مثل Twofish, Serpent, و RSA. من الأمثلة المكسورة RC4 و DES. Symmetric cryptography: نظام AES واحد منها, و كذلك Twofish, Serpent, Skipjack, Blowfish, و غيرهم. Public-key cryptography: تستخدم RSA, ElGamal, Diffie-Hellman (DH), كأمثلة مشهورة في PGP. Hash function: دالة MD5 و SHA-1 من أشهر الدالات, و لكنهما غير آمنين. من الأمثلة الأخرى SHA-2 و SHA-3.

[caption id="attachment_130787" align="aligncenter" width="740"]Cryptographic Hash Function By User:Jorge Stolfi based on Image:Hash_function.svg by Helix84 (Original work for Wikipedia) [Public domain], via Wikimedia Commons[/caption][caption id="attachment_130788" align="aligncenter" width="288"]Public-key-crypto-1 By KohanX [Public domain], via Wikimedia Commons[/caption][caption id="attachment_130789" align="aligncenter" width="525"]Public key encryption By No machine-readable author provided. Davidgothberg assumed (based on copyright claims). [Public domain], via Wikimedia Commons[/caption][caption id="attachment_130790" align="aligncenter" width="536"]Public key shared secret By No machine-readable author provided. Davidgothberg assumed (based on copyright claims). [Public domain], via Wikimedia Commons[/caption]

الجزء العملي

تريد Alice إرسال رسالة مشفرة إلى Bob. فتقوم في البداية بالبحث عن اسمه في الـ Key servers (هذه سيرفرات يمكن رفع المفاتيح العامة إليها للبحث عنها), و لكنها لا تجده. تقوم بطلبه من Bob, و لكن Bob ليس لديه واحداً.

على Bob إنشاء زوج مفاتيح (Key pair). يدعى بزوج مفاتيح, لأن المفتاح العام (Pubkey) يحتاج إلى مفتاح سري (Secret/Private key).

في شرحي سأستخدم gpg 2.1.10 على Linux, أو KGpg (و هو Front-end في KDE). و لكن الكلام ينطبق على أي برنامج يتبع OpenGPG. في ويندوز تستخدم حزمة Gpg4win للتسهيل على المستخدمين, بينما يمكن استخدام حزمة GPGTools في Mac OS X.

gpg --version

هذه صورة لمفتاح باسم Bob ArabHardware قمت بعمله لهذا الشرح, و رقمه (Key ID) هو 504FBE57. الـ ID هو رقم hex مكون من 16 خانة (ما يدعى بالـ Long ID), و لكن يستخدم النصف الثاني عادة ً (أي آخر 8 أرقام. ما يدعى بالـ Short ID).

KGpg - New pair