في هذه المقالة، سنتعلَّم آلية عمل التشفير باستخدام المفتاح المتماثل من منظور عملي.

في مقالتنا السابقة: "مقدمة في التشفير لمبرمجي أنظمة لينكس المُدمَجة"، تعرَّفْنا على المفاهيم الأساسية، والتي تشمل: مقدمة عن الأمن السيبراني، والسرية، والتشفير، والدوافع الرئيسية للتشفير وآلية عمله وأنواعه (التشفير بالمفتاح المتماثل وغير المتماثل)، وأكثر خوارزميات التشفير شيوعًا والمفاضلات بينها.

في هذه المقالة، سنستخدِم بَرمجيّة «أوبن أس أس أل» (OpenSSL) لنُطبِّق بعض مفاهيم التشفير باستخدام المفتاح المتماثل بصورة عملية.

لتتبع محتوى هذه المقالة ولتطبيق الأوامر عمليًا على أجهزتكم الشخصية، يكفيكم وجود طرفية (terminal) مزوَّدة بأحدث نسخة من برمجيّة OpenSSL.

استمتعوا! :-)

 

التشفير المتماثل

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

تتوفر عدة خوارزميات تشفير بالمفتاح المتماثل (مثل DES، AES، IDEA، Blowfish، RC4، إلخ)، وتُعدّ خوارزمية

AES (Advanced Encryption Standard) الأكثر شيوعًا في هذا المجال.

تُمثِّل AES معيارًا لتشفير البيانات الإلكترونية أقرَّه المعهد الوطني الأمريكي للمعايير والتقانة (NIST) عام ٢٠٠١، وأصبح يُعمَل به في الحكومة الفيدرالية الأمريكية عام ٢٠٠٢. وتُعدّ أيضًا الخوارزمية الأولى (والوحيدة) للتشفير المتاحة للعامة التي تحظى بموافقة وكالة الأمن القومي الأمريكية (NSA) لاستخدامها في حماية المعلومات السريّة للغاية. لن أصدِر حكمًا على ما إذا كان هذا الأمر جيدًا أم سيئًا. :-)

تعدّ AES خوارزمية تشفير كُتليّ (block cipher) تعمل على كُتَل بيانات بحجم ١٢٨ بِت. بما معناه؛ تُجزّء هذه الخوارزمية النص الأصلي (غير المُشفَّر) إلى كُتَل حجمها ١٦ بايت، وتُشَفِّر كل كتلة على حِدة، ثمّ تجمع تلك الكُتَل المُشفَّرة لتُكَوِّن النص المُشَفَّر.

يتراوح حجم المفاتيح ما بين ثلاثة أحجام (١٢٨، أو ١٩٢، أو ٢٥٦). تُعزِّز المفاتيح كبيرة الحجم درجة الأمان عادة، خصوصًا ضد هجمات القوة العمياء (brute-force attacks) في معظم الحالات.

على الجانب الآخر، قد تستغرِق عملية التشفير وقتًا أطولًا عند استخدام المفاتيح الأكبر حجمًا. على سبيل المثال، تجري AES عمليات حسابية إضافية عند استخدام مفاتيح أكبر حجمًا. حاليًا، يُعدّ مفتاح AES حجمه ١٢٨ بِت حلًّا وسطًا يجمع بين الكفاءة والأمان.

لذا، لنبدأ بإنشاء مفتاح حجمه ١٢٨ بِت للتشفير بخوارزمية AES.

 

توليد المفتاح المتماثل

إن مفتاح التشفير سلسلة عشوائية من البِتّات تُضَع خصيصًا بهدف ترميز البيانات وفكّ ترميزها. كلما زادت عشوائية هذه السلسلة، كان ذلك أفضل.

هذا أحد الأسباب التي تجعل مُولِّد الأرقام العشوائية أداة بالغة الأهمية في عالم التشفير (التعمية). إذا أردت أن تعرف المزيد عن الأرقام العشوائية، أنظر مقالة بعنوان ما هي الأرقام العشوائية وكيف تُنظَّم على «لينكس»؟

يمكن إنشاء المفتاح يدويًا عن طريق كتابة أي رمز لا يتعدى حجمه ١٢٨ بِت (لغرض هذا المقال، لن نهتم كثيرًا بعشوائية المفتاح). ولكن، يُسهِّل استخدام أداة OpenSSL هذه العملية:

$ openssl enc -pbkdf2 -aes-128-ecb -k
my-secret-passphrase -P
salt=291F74776135CAF2
key=4A48195DFA143D17F44AB817C831FACF

يطلُب هذا الأمر من OpenSSL أن تُنشِئ مفتاح ١٢٨ بِت لخوارمية AES (-aes-128-ecb) باستخدام دالّة اشتقاق المفاتيح المعتمدة على كلمة المرور: (pbkdf2-) وأن يطبع المفتاح على الطرفية (P-).

تسمى دالّة اشتقاق المفاتيح المعتمدة على كلمة المرور التي استُخدِمَت: PBKDF2. هذه الخوارزمية ستطبِّق دالّة تجزئة (hash function) على عبارة المرور المُعطاة (k- وهي عبارة المرور الخاصة بي) بالإضافة إلى ملح (salt) عشوائي، مع تكرار العملية عدّة مرات لإنتاج مفتاح مشتق آمن.

الملح في إنشاء المفتاح

الملح سلسلة عشوائية من البِتّات تُضاف إلى بيانات الإدخال (مثل كلمة المرور) إلى جانب عملية التجزئة (Hashing). تُستخدَم لتعزيز درجة أمان التشفير. بدون استخدام الملح، ستُنتِج عبارة المرور نفسها دائمًا المفتاح ذاته!

والآن، لنحفظ المفتاح المشتَق في ملف:

$ echo 4A48195DFA143D17F44AB817C831FACF > key.priv

أصبحنا جاهزين! لنُشفِّر بعض النصوص.

 

التشفير بخوارزمية AES-١٢٨

سنُشفِّر مقتطفًا من بيان «الهاكر» (The Hacker Manifesto)، كَتَب هذا البيان «هاكر» أمني يُعرف باسمه المستعار «المُرشِد» (The Mentor) عام ١٩٨٦:

$ cat cleartext.txt
هذا عالمنا الآن... عالم الإلكترون، والمفاتيح الإلكترونية، وروعة التضمين الرقمي.
نحن نستعمِل خدمات موجودة دون أن ندفع مقابل ما كان من الممكن ان يكون
سعره رخيصًا لولا أن القائمين وراءه جشعون جدًا، وأنتم تسمّوننا مجرمين. نحن
نستكشِف... وأنتم تسمّوننا مجرمين.
نحن نبحث عن العلم... وتسمّوننا مجرمين. نحن نعيش بدون لون بشرة، وبدون
تطرف وطني أو تمييز ديني... وتسمّوننا مجرمين. أنتم تبنون القنابل النووية،
وتخوضون الحروب، وتقتلون، وتغشّون، وتُكذِّبون لتجعلونا نصدِّق أن الأمر لمصلحتنا،
ومع ذلك... نحن المجرمون.
نعم... أنا مجرم، وجريمتي هي الفضول. جريمتي هي الحكم على الناس وفق
أقوالهم وأفكارهم، لا وفق منظرهم. جريمتي هي أنني أدهى منكم، وهذا شيء لن
تغفروه لي ابدًا.
أنا هاكر وهذا بياني. قد تتمكنون من إيقاف هذا الفرد، ولكن لن توقفونا جميعًا...
لأننا جميعنا متماثلون.

يُشفِّر الأمر أدناه الملف بخوارزمية AES-١٢٨ (enc -aes-128-ecb وسيأخذ الملف المُدخَل من خيار in- ويُشفِّره باستخدام المفتاح المُحدَّد في خيار K- ويولِّد ملف مُشفَّر بعنوان ciphertext.txt باستخدام خيار out-. سهلة، أليس كذلك؟

$ openssl enc -aes-128-ecb -in cleartext.txt -K $(cat key.priv) -out ciphertext.txt

والآن إذا أردت أن تَطبَع الملف المُشفَّر (ciphertext.txt)، سترى قمامة على الشاشة.

وبنفس الطريقة، يُمكِننا أن نفكَ التشفير بتمريره عبر خيار d-:

$ openssl enc -d -aes-128-ecb -in ciphertext.txt -K $(cat key.priv)
هذا عالمنا الآن... عالم الإلكترون، والمفاتيح الإلكترونية، وروعة التضمين الرقمي.
نحن نستعمِل خدمات موجودة دون أن ندفع مقابل ما كان من الممكن ان يكون
سعره رخيصًا لولا أن القائمين وراءه جشعون جدًا، و

هناك مشكلة واحدة في أسلوب التشفير هذا. نحن نستخدِم نمط التشفير الكُتَليّ المسمى كتاب الكود الإلكتروني ECB (Electronic codebook). يُسرِّب هذا النمط المعلومات ويُعَدّ نمطًا غير آمن للاستخدام!

لذا دعونا نتعلم الآن عن أنماط التشفير الكُتَليّ وما يجعل ECB نمطًا غير آمن…
 

ECB وأنماط التشفير الكُتَليّ

قبل أن نخوض في تفاصيل المشكلة، أودّ أن أريكم مدى هشاشة نمط ECB من الناحية الأمنية.

على سبيل المثال، فلنأخذ صورة «تكس» البطريق العزيز علينا:


tux1.png

حمِّل الصورة وحوِّلها إلى صيغة PPM لتُسهِّل معالجة ترويسة الصورة ومتنها (header & body):

$ wget https://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png
$ convert Tux.png tux.ppm

ثم قسِّم الملف إلى جزئين؛ الترويسة والمتن:

$ head -n$ 3 tux.ppm > header.txt
$ tail -n +4 tux.ppm > body.bin

شفِّر المتن بخوارزمية AES-١٢٨ بر تطبيق نمط ECB وأرجِع الترويسة لتوليد صورة جديدة متنها مُشفَّر:

$ openssl enc -aes-128-ecb -in body.bin -K $(cat key.priv) -out body.ecb.enc
$ cat header.txt body.ecb.enc > tux-ecb-enc.ppm

افتح الصورة المُشفَّرة (tux-ecb-enc.ppm) أنظر النتيجة بنفسك!


tux2.jpg 
 

هل ترى «تكس»؟ لكن لماذا؟

كما ذكرنا سابقًا، إنّ AES خوارزمية تشفير كُتليّ (block cipher) تعمل على كُتَل بيانات حجمها ١٢٨ بِت. عندما نستخدِم نمط ECB، ستُشَفَّر كل كتلة على حِدة. تُنتِج الكتل التي تتضمن نفس المحتوى نفس القيمة!

ecb

رغم أن الصورة مُشفَّرة ولا نعرف محتواها، إلّا أنّنا لا زِلنا نرى أنماط البيانات. هذا يعني أن نمط ECB يُسرّب المعلومات، لهذا هو هشّ وغير آمن ولا ينبغي أن تستخدمه أبدًا!

أنظر هذه الصفحة في موسوعة «ويكيبيديا»، ستجد أنّ هناك أنماط تشغيل مختلفة لشفرات الكتل؛ أكثرها شيوعًا (Cipher Block Chaining) CBC.

 

التشفير بخوارزمية AES بنمط CBC

في نمط CBC، تُستَخدَم كل كتلة مُشفَّرة (نصّ مُشفَّر) كمُدخَل لتشفير الكتلة التالية. أمّا بالنسبة للكتلة الأولى، فنحتاج إلى متَّجه تهيئة (Initialization Vector) وهو رقم عشوائي وفريد يطابق عادةً الكتلة حجمًا.

cbc

يمكنك أن تولِّد متَّجه التهيئة (IV) باستخدام دالّة rand في OpenSSL:

$ openssl rand -hex 16 > iv.txt $ cat iv.txt
$ cat iv.txt
e9c43ea833e188d65ed225893af227f2

يمكنك الآن أن تولِّد الصورة بتمريرها عبر نمط aes-128-cbc- بالإضافة إلى مُتَّجه التهيئة عبر خيار iv-:

$ openssl enc -aes-128-cbc -in body.bin -K $(cat key.priv) -iv $(cat iv.txt) -out body.cbc.enc

أضف الترويسة إلى الصورة المُشفَّرة:

$ cat header.txt body.cbc.enc > tux-cbc-enc.ppm

وافتح الصورة المُشفَّرة (tux-cbc-enc.ppm) لتتأكد أن المعلومات لم تعد تتسرب (ستبدو الصورة مثل القمامة): 
 

tux3.jpg

 

في هذه المقالة، تعلَّمنا بعض المفاهيم الأساسية حول التشفير المتماثل، باستخدام خوارزمية AES في نمطي ECB وCBC لتشفير وفكّ تشفير البيانات. في المقالة التالية، سنتعمّق أكثر في التشفير غير المتماثل والتواقيع الرقمية.

نتطلَّع إلى رؤيتكم هناك!
 



تمت إعادة نشر هذا المقال وفقاً لرخصة المشاع الإبداعي - Creative Commons، للإطلاع على المقال الأصلي.