تشفير المفتاح المتماثل
في هذا الدرس سنتناول تشفير المفتاح المتماثل الذي يؤمّن كثيرًا من البيانات الساكنة والمنقولة بفضل كفاءته العالية.
بنهاية الدرس سنكون قد غطّينا:
- ما هو تشفير المفتاح المتماثل
- أمثلة برمجية بلغة Python توضّح استخدام تشفير المفتاح المتماثل
- نظرة على تطبيقات تشفير المفتاح المتماثل
- تطبيقات تشفير المفتاح المتماثل
- أمان تشفير المفتاح المتماثل
- التهديدات التي تواجه هذه الخوارزميات من الحواسيب الكلاسيكية والكمومية على حدٍّ سواء
مقدمة في تشفير المفتاح المتماثل
تشفير المفتاح المتماثل (SKC) هو أقدم أشكال التشفير وأكثرها بديهية. في SKC، تُؤمَّن المعلومات السرية عبر تشفير المفتاح المتماثل (SKE)، أي باستخدام مفتاح سري واحد لعمليتَي التشفير وفك التشفير معًا.
يشمل SKC:
- دالة تشفير تحوّل نصًّا عاديًّا معيّنًا إلى ciphertext مع استخدام مفتاح سري
- دالة فك تشفير تعكس العملية بتحويل ciphertext مجددًا إلى نص عادي باستخدام المفتاح السري ذاته
النص العادي يمكن أن يكون أي نوع من البيانات غير المشفّرة كالنص البشري الطبيعي أو الشفرة الثنائية التي يمكن الوصول إلى محتواها المعلوماتي مبدئيًّا، بينما يشير ciphertext إلى البيانات المشفّرة التي يُقصد ألّا يكون محتواها متاحًا قبل فك التشفير.
الخوارزمية التي تصف عمليتَي التشفير وفك التشفير باستخدام مفتاح سري مشترك تُسمّى أيضًا symmetric cipher.

ال شكل 1. تشفير المفتاح المتماثل لنص عادي معطى إلى ciphertext وفك تشفيره مجددًا إلى النص العادي باستخدام المفتاح ذاته.
خصائص أنظمة تشفير المفتاح المتماثل
يجب أن يضمن نظام تشفير المفتاح المتماثل الخصائص التالية لتأمين الرسائل — سواء أكانت بيانات مخزّنة ساكنة أم اتصالات عبر قناة إرسال ما:
- السرية: تشير إلى خاصية حماية محتوى الرسائل المشفّرة من الوصول غير المصرّح به.
- النزاهة: تشير إلى خاصية إمكانية اكتشاف أي تلاعب بالرسائل المشفّرة أثناء التخزين أو الإرسال.
- الأصالة: تشير إلى خاصية تمكين مستلم الرسالة من التحقق من هوية المرسل واكتشاف انتحال الشخصية من قِبَل طرف غير مصرّح له.
علاوة على ذلك، يجب تحقيق هذه الخصائص في بيئة قد تكون فيها الخوارزميات أو الأصفار المستخدمة للتشفير وفك التشفير عامّة، وحيث يُتحكَّم في الوصول إلى محتوى الرسائل المشفّرة حصرًا عبر الوصول إلى المفتاح السري.
لذا فإن تطبيق نظام تشفير مفتاح متماثل آمن يتضمّن مهمت ين رئيسيتين:
- استخدام خوارزمية تشفير مفتاح متماثل قوية مقاومة للهجمات التشفيرية.
- ضمان سرية توزيع المفاتيح السرية وإدارتها.
في هذا الدرس سنناقش الجوانب المتعلقة بالمهمة الأولى التي تشكّل الاهتمام الرئيسي لتقنية SKC. أما المهمة الثانية فتحتاج إلى حلول تقع خارج نطاق SKC ذاتها وسيتم تقديمها لاحقًا.
توضيح تشفير المفتاح المتماثل باستخدام Python
سنعرض مثالًا بسيطًا لعمليتَي التشفير وفك التشفير باستخدام Caesar shift cipher الكلاسيكي ونظام Advanced Encryption System (AES) الحديث الذي أصبح معيار تشفير المفتاح المتماثل منذ عام 2001. أولًا سنضبط بعض مكتبات Python التي توفّر أصفار تشفير المفتاح المتماثل المطلوبة، ثم نحدّد النص العادي الذي نريد تشفيره.
# Added by doQumentation — required packages for this notebook
!pip install -q cryptography numpy secretpy
# Install the library if needed
# %pip install secretpy
# import the required crypto functions which will be demonstrated later
from secretpy import Caesar
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from functools import reduce
import numpy as np
# Set the plaintext we want to encrypt
plaintext = "this is a strict top secret message for intended recipients only"
print(f"\nGiven plaintext: {plaintext}")
سنرى كيفية تشفيره وفك تشفيره باستخدام طريقتين مختلفتين لتشفير المفتاح المتماثل:
- الكلاسيكي Caesar shift cipher
- البروتوكول الحديث Advanced Encryption Standard AES-256
Caesar shift cipher:
يتضمّن تشفير Caesar shift تحديد:
- أبجدية الأحرف الممكنة للترميز
- قيمة الإزاحة التي يمكن أن تتراوح بين 0 (بدون تشفير) وطول الأبجدية. نعتبر هذه هي المفتاح.
يُعرف بأنه monoalphabetic substitution cipher لأن كل حرف من النص العادي يُستبدل بحرف آخر في ciphertext.
في هذا المثال سنستخدم الأحرف الصغيرة من الأبجدية.
لنبدأ بإعداد الأمور.
# initialize the required python object for doing Caesar shift encryption
caesar_cipher = Caesar()
# Define the shift, ie the key
caesar_key = 5
print(f"Caesar shift secret key: {caesar_key}")
# Define the alphabet
alphabet = (
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
" ",
)
print(f"alphabet: {alphabet}")
شفّر النص العادي للحصول على النص المشفّر باستخدام تشفير Caesar.
caeser_ciphertext = caesar_cipher.encrypt(plaintext, caesar_key, alphabet)
print(f"Encrypted caeser shift ciphertext: {caeser_ciphertext}")
فكّ تشفير النص المشفّر للرجوع إلى النص العادي الأصلي باستخدام نفس المفتاح المستخدم في التشفير.
caeser_plaintext = caesar_cipher.decrypt(caeser_ciphertext, caesar_key, alphabet)
print(f"Decrypted caeser shift plaintext: {caeser_plaintext}\n")
تشفير المعيار المتقدم (AES)
هنا نشفّر النص العادي باستخدام AES، وهو خوارزم ية تشفير بالمفتاح المتماثل شائعة الاستخدام.
نبدأ بإنشاء المفتاح، وفي هذه الحالة سيكون سلسلة عشوائية من 16 حرفًا.
# lambda defines an inline function in this case that takes two values a,b with the resulting expression of a+b
# reduce uses a two-argument function(above), and applies this to all the entries in the list (random alphabet characters) cumulatively
aes_key = reduce(lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)])
print(f"AES secret key: {aes_key}")
يدعم AES عدة أنماط تشغيل وعلينا تحديد النمط الذي نريد استخدامه.
نختار نمط Cipher Block Chaining (CBC) المتوفر في الكلاس modes.CBC من مكتبة cryptography. يستخدم نمط CBC في AES عشوائية لتعزيز الأمان، وهذا يستلزم تحديد Initialization Vector (IV) عشوائي، يُعرف أيضًا بـ nonce. سنستخدم سلسلة عشوائية لهذا الغرض أيضًا، تمامًا كما فعلنا مع المفتاح.
aes_initialization_vector = reduce(
lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)]
)
print(f"AES initialization vector: {aes_initialization_vector}")
يمكننا الآن إنشاء تشفير AES نيابةً عن مُرسِل الرسالة السرية. لاحظ أن initialization vector يُمرَّر إلى الكلاس modes.CBC لإعداد نمط تشغيل CBC.
ثم نشفّر النص العادي لإرساله.
# The encryptor is setup using the key and CBC. In both cases we need to convert the string (utf-8) into bytes
sender_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_encryptor = sender_aes_cipher.encryptor()
# update can add text to encypt in chunks, and then finalize is needed to complete the encryption process
aes_ciphertext = (
aes_encryptor.update(bytes(plaintext, "utf-8")) + aes_encryptor.finalize()
)
# Note the output is a string of bytes
print(f"Encrypted AES ciphertext: {aes_ciphertext}")
لفكّ التشفير، لنُنشئ تشفير AES نيابةً عن المستقبِل. لاحظ أن المستقبِل المقصود لديه حق الوصول إلى المفتاح السري وإلى initialization vector، لكن الأخير لا يشترط أن يكون سريًا.
# Similar setup of AES to what we did for encryption, but this time, for decryption
receiver_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_decryptor = receiver_aes_cipher.decryptor()
# Do the decryption
aes_plaintext_bytes = aes_decryptor.update(aes_ciphertext) + aes_decryptor.finalize()
# convert back to a character string (we assume utf-8)
aes_plaintext = aes_plaintext_bytes.decode("utf-8")
print(f"Decrypted AES plaintext: {aes_plaintext}")
تطبيقات التشفير بالمفتاح المتماثل
بينما خرجت الشفرات الكلاسيكية من الاستخدام منذ زمن بعيد، مثل تشفير Caesar، فإن أنظمة التشفير المتماثل الحديثة مثل AES تُستخدم في مجموعة واسعة من التطبيقات، منها:
-
تشفير البيانات وفكّ تشفيرها: يُستخدم SKC على نطاق واسع لحماية البيانات الحساسة، سواء كانت مخزّنة على جهاز أو مُرسَلة عبر الشبكة. تشمل الأمثلة حماية بيانات اعتماد المستخدمين، وتشفير رسائل البريد الإلكتروني، وتأمين المعاملات المالية وغير ذلك.
-
الاتصالات الآمنة: تستخدم بروتوكولات الاتصال الشائعة مثل SSL/TLS مزيجًا من تشفير المفتاح المتماثل وغير المتماثل لضمان سرية البيانات المتبادلة بين طرفين وسلامتها. تُشفَّر هذه الرسائل وتُفكَّك باستخدام تشفير المفتاح المتماثل الذي يعتمد على مفتاح مشترك. ويُتبادَل المفتاح المستخدم في التشفير المتماثل بأمان عبر تشفير المفتاح غير المتماثل الذي يعتمد على زوج مفاتيح عامة-خاصة. التشفير بالمفتاح المتماثل أسرع بكثير، ومن ثَمّ يمكن استخدامه لتشفير رسائل ضخمة الحجم.
-
التحقق من الأصالة: في بعض السياقات، يُستخدم SKC عبر تقنيات مثل رموز مصادقة الرسائل (MACs) ورموز HMAC للتحقق من أصالة الرسائل وسلامتها، وضمان اتصالات مقاومة للتلاعب.
-
تشفير الملفات والأقراص: تعتمد برامج تشفير القرص الكامل وأدوات تشفير الملفات على SKC لحماية البيانات الحساسة المخزّنة على الأقراص الصلبة أو أجهزة التخزين المحمولة.
-
الشبكات الافتراضية الخاصة: تهدف تقنيات VPN إلى توفير قنوات اتصال سرية بعيدة عن التنصت، ويمكنها استخدام تشفير المفتاح المتماثل أو غير المتماثل لربط المستخدمين عن بُعد وكذلك شبكات الشركات.
التنوع الكبير في التطبيقات التي يُستخدم فيها SKC يستلزم بدوره أن تستوفي أنظمة التشفير المتماثل مجموعة من المعايير المحددة.
مبادئ التشفير بالمفتاح المتماثل
في هذا القسم، سنناقش بعض المبادئ الأساسية التي يقوم عليها أمان خوارزميات التشفير بالمفتاح المتماثل.
المقاومة ضد هجمات القوة الغاشمة: المتطلب الأساسي لأمان أي شفرة تشفير هو أن يكون حجم فضاء المفاتيح — أي عدد المفاتيح المتميزة الممكنة التي كان بإمكان مستخدم الخوارزمية الاختيار منها — كبيرًا جدًا.
المقاومة ضد هجمات التحليل التشفيري: المتطلب الأساسي الثاني لأي شفرة، متماثلة أو غيرها، هو قدرتها على توليد نصوص مشفّرة يصعب استيعابها من الناحية المعلوماتية. لتحقيق هذا، شرط ضروري لكنه غير كافٍ من منظور نظرية المعلومات هو أن تتميز النصوص المشفّرة بانتروبيا عالية، مما يجعلها لا تختلف عن النص العشوائي بدون أنماط أو ارتباطات واضحة. بهذه الطريقة، لا يستطيع المهاجم الحصول على أي معلومات عن النص العادي أو المفتاح السري من خلال محاولة تحليل النص المشفّر باستخدام تحليل التردد أو غيره من التقنيات الإحصائية.
تتجسّد المقاومة ضد الأشكال العامة لهجمات التحليل التشفيري الكافية لضمان الأمان الدلالي رسميًا عبر مفهوم عدم التمييز. وعلى الرغم من وجود عدة أشكال لعدم التمييز بمتطلبات مختلفة، يُعدّ نظام التشفير المتماثل آمنًا دلاليًا إذا استوفى معيار عدم التمييز في ظل هجوم النص العادي المختار (IND-CPA). يعني هذا أن المهاجم لا يستطيع التمييز بين تشفيري رسالتين مختلفتين حتى لو سُمح له بإرسال نصوص عادية متعددة من اختياره إلى الخوارزمية ومشاهدة النصوص المشفّرة المقابلة.
كما سنرى لاحقًا، يستلزم IND-CPA عادةً استخدام العشوائية لضمان أن كل مرة يُشفَّر فيها نص عادي معين بمفتاح سري معين، يكون النص المشفّر الناتج مختلفًا بشكل غير متوقع في كل عملية تشفير.
أوجه قصور الشفرات الكلاسيكية: قبل ظهور التشفير الحديث في سبعينيات القرن الماضي، كانت معظم الشفرات الكلاسيكية المستخدمة عمليًا تفشل في استيفاء أحد هذين المتطلبين أو كليهما. على سبيل المثال، اتسمت شفرات الاستبدال المبكرة كـتشفير Caesar الأحادي الأبجدية بصغر حجم فضاء المفاتيح (انظر الجدول 1) وانخفاض انتروبيا النص المشفّر، مما جعلها غير آمنة أمام مجموعة متنوعة من هجمات التحليل التشفيري كهجمات القوة الغاشمة وتحليل التردد وهجمات النص العادي المعروف (KPT).
جاءت بعدها شفرات الاستبدال متعددة الأبجديات مثل تشفير Vigenère وتشفير آلة Enigma بفضاء مفاتيح كبير فعليًا يجعلها مقاومة لهجمات القوة الغاشمة، لكنها كانت عرضة لتحليل التردد وهجمات KPT على التوالي. وعلى غرار شفرات الاستبدال، فإن شفرات التبديل الكلاسيكية التي تُعيد ترتيب الحروف في الرسالة بدلًا من استبدالها، تتعرض هي الأخرى لأنواع متعددة من الهجمات كالتحريف الأنغرامي والتحليل الإحصائي والقوة الغاشمة وهجمات KPT وغيرها.
من الناحية النظرية، تشفير الاستبدال متعدد الأبجديات المعروف بـone-time pad (OTP) آمن تشفيريًا. يتميز OTP بمفتاح سري ينبغي أن يكون: (1) مكوّنًا من حروف أو بتات مختارة عشوائيًا، (2) بطول لا يقل عن النص العادي الأصلي، (3) مستخدمًا مرة واحدة فقط. لكن OTP غير عملي للتطبيقات الفعلية لأنه لو أمكن تبادل المفتاح السري — الذي يجب أن يكون بطول النص العادي ولا يُستخدم إلا مرة — بأمان، لأمكن كذلك تبادل النص العادي الأصلي. يبرز OTP في المقابل قيمة العشوائية في توليد نصوص مشفّرة آمنة.
على المهاجم الذي يحاول تنفيذ بحث بالقوة الغاشمة في فضاء المفاتيح للعثور على مفتاح يفكّ تشفير الرسالة أن يُنجز عددًا من العمليات يتناسب مع حجم فضاء المفاتيح.
لذلك، يوفر حجم فضاء المفاتيح الكبير مقاومةً ضد هجمات القوة الغاشمة بجعلها غير ممكنة حسابيًا. يُدرج الجدول 1 أحجام فضاء المفاتيح لبعض الشفرات المعروفة.
الجدول 1: أحجام فضاء المفاتيح لبعض الشفرات المتماثلة
| Cipher | Key length | Key space size |
|--------------|------------------|-------------------------------------------| | Caeser shift | 1 | alphabet-size | | Vigenere | n | alphabet-size | | One-time-pad | plaintext-length | alphabet-size | | DES | 56 | 2 | | AES-128 | 128 | 2 | | AES-192 | 192 | 2 | | AES-256 | 256 | 2 | | ChaCha20 | 256 | 2 | أنظمة التشفير بالمفتاح المتماثل الحديثة تتغلب إلى حد بعيد على قيود الشفرات الكلاسيكية. فهي تنتج نصًا مشفرًا مقاومًا لـ cryptanalysis، وتتميز بمساحات مفاتيح كبيرة مع كونها أكثر كفاءة عملية بكثير من الـ OTP.
Block ciphers: فئة من الشفرات الحديثة — مثل DES وAES — تحقق الأمان بالجمع بين مبدأَي confusion وdiffusion اللذين قدّمهما Claude Shannon في الأصل. نتحدث عن هذه المفاهي م في سياق أنظمة التشفير التي تعمل على التمثيلات الثنائية للرسائل:
-
Confusion: هي الخاصية التي بموجبها يعتمد كل bit في النص المشفر على عدة bits من المفتاح السري. وهي تضمن أن أي تغيير بسيط في المفتاح السري يعدّل تقريبًا كل bits النص المشفر، مما يُعمّي العلاقة بين النص المشفر والمفتاح السري.
-
Diffusion: هي الخاصية التي بموجبها يؤدي قلب bit واحد في النص العادي إلى تعديل ما يقارب نصف bits النص المشفر والعكس صحيح. وتُخفي diffusion العلاقات الإحصائية بين النص العادي والنص المشفر. تُحقق الشفرات ذات الـ diffusion الكافية ما يُعرف بـ avalanche criterion في علم التشفير.
تُطبّق block ciphers الـ confusion والـ diffusion باستخدام بنى تشفيرية تُعرف بـ substitution-permutation networks (SPNs) تعمل على كتل بيانات منفصلة. تقبل الـ SPN كتلة من النص العادي والمفتاح السري كمدخلات، وتُنفّذ عددًا محددًا من rounds من التحويلات لإنتاج كتلة نص مشفر. يتكوّن كل round من بنى رياضية متناوبة تُعرف بصناديق الاستبدال (S-boxes) وصناديق التبديل (P-boxes) أو ما يعادلها من عمليات.
تُطبّق هذه البنى على التوالي تحويلات خطية وغير خطية معقدة على كتل المدخلات، مما يؤدي إلى avalanche effects في النص المشفر.
تُصمَّم SPNs بحيث يزيد تكثيف عدد الـ rounds عادةً من أمان الشفرة. يقودنا هذا إلى مفهوم security margin. Security margin: هو الفرق بين عدد rounds في التطبيق الكامل للشفرة المبنية على SPN، وأقصى عدد من rounds يُعرف أنه قابل للكسر باستخدام أفضل هجوم معروف في العالم الواقعي.
على سبي ل المثال، أفضل الهجمات الحالية الأسرع من brute-force ضد AES-256 يمكنها كسر ما يصل إلى 9 rounds من أصل 14 round في الشفرة الكاملة عند استخدامها في الوضع المعياري المعروف بـ Electronic Codebook (ECB) mode. لذلك، security margin الحالي لـ AES-256 هو 5 rounds.
Stream ciphers: كبديل لـ block ciphers، صمّم علماء التشفير الحديثون أيضًا stream ciphers آمنة عمليًا مثل Chacha20. تستخدم هذه الشفرات العشوائية كجزء أساسي من تصميمها، وتعمل على keystreams شبه عشوائية من bits بدلًا من كتل بيانات منفصلة.
وبناءً على ذلك، تجمع stream ciphers بين مفتاح سري وinitialization vector (IV) لتغذية pseudorandom random number generator (PRNG) لإنتاج keystream من bits عشوائية تُدمج بعد ذلك مع النص العادي للحصول على النص المشفر. بهذا المعنى، تشبه stream ciphers الـ one-time pad (OTP) لكنها تتميز بأطوال مفاتيح سرية أقصر ومفاتيح قابلة لإعادة الاستخدام، مما يجعلها أكثر عملية. غير أنها لهذا السبب بالذات لا تضمن السرية المطلقة على عكس OTP.
Semantic security: نختتم هذا القسم بالعودة إلى مفهوم الـ semantic security أو الـ IND-CPA level security الذي قدّمناه أعلاه. العمليات الأساسية التي تُنفّذها block ciphers مثل S-box وP-box هي عمليات حتمية. هذا يعني أنه في أوضاع التشغيل المعيارية مثل ECB، أي زوج من النص العادي والمفتاح يُنتج دائمًا نفس النص المشفر، وهو وضع عرضة لهجمات chosen-plain-text.
لتحقيق الأمان بمستوى IND-CPA، تحتاج block ciphers إلى العمل في وضع يستخدم العشوائية المُدخَلة عبر initialization vector (IV) شبه عشوائي مع اشتراط إضافي بأن لا تستخدم أي عمليتان تشفير نفس زوج المفتاح-IV. يدعم AES عدة أوضاع تشغيل مثل cipher block chaining (CBC) التي توفر أمانًا بمستوى IND-CPA. ينطبق متطلب مشابه أيضًا على stream ciphers حيث يجب عدم استخدام نفس زوج المفتاح-IV لتغذية PRNG أكثر من مرة إن كان IND-CPA مطلوبًا.