تشفير AES-GCM وفك تشفيره في Python
نفّذ تشفيرًا موثَّقًا مع إدارة سليمة لـ nonce
تشفير AES-GCM وفك تشفيره في Python درس مجاني في Cryptology Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cryptology Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
لماذا نستخدم AES-GCM؟
AES-GCM هو نمط التشفير الموثّق مع البيانات المرتبطة (AEAD). فهو يوفر السرية (AES-CTR) والسلامة/الأصالة (GHASH MAC) في تمريرة واحدة — وهو المعيار للتشفير الحديث.
مكوّنات GCM: CTR + GHASH
AES-GCM = AES في نمط العداد (للتشفير) + MAC كثير الحدود GHASH (للمصادقة). وتغطي علامة المصادقة ذات 128 بت كلًا من النص المشفّر وبيانات المصادقة الإضافية الاختيارية (AAD).
متطلبات Nonce
يجب عدم إعادة استخدام قيمة nonce ذات 96 بت مع المفتاح نفسه مطلقًا. تؤدي إعادة استخدام nonce إلى كسر GCM بالكامل — إذ يستعيد المهاجم مفتاح المصادقة ويمكنه تزوير النصوص المشفّرة. استخدموا قيم nonce عشوائية أو عدّادًا مع تدوير المفاتيح.
التشفير باستخدام AES-GCM في Python
باستخدام طبقة hazmat:
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)
plaintext = b"sensitive payload"
aad = b"user_id=42" # authenticated but not encrypted
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())فك التشفير باستخدام AES-GCM في Python
يتحقق فك التشفير من العلامة تلقائيًا؛ ويُطلق InvalidTag عند الفشل:
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag
# key, nonce, ciphertext, aad from previous step
try:
recovered = aesgcm.decrypt(nonce, ciphertext, aad)
print("Decrypted:", recovered)
except InvalidTag:
print("Authentication failed — ciphertext tampered!")تخزين Nonce مع النص المشفّر
أضيفوا nonce في بداية النص المشفّر قبل تخزينه. وعند فك التشفير، افصلوا البيانات عند البايت 12:
def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce = os.urandom(12)
ct = aesgcm.encrypt(nonce, data, aad or None)
return nonce + ct # prepend nonce
def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce, ct = blob[:12], blob[12:]
return aesgcm.decrypt(nonce, ct, aad or None)بيانات المصادقة الإضافية (AAD)
تتم مصادقة AAD، لكنها لا تُشفّر. استخدموها لربط النص المشفّر بسياقه: معرّف المستخدم، ومعرّف السجل، وإصدار API. ويمنع ذلك المهاجم من نقل نص مشفّر صالح إلى سياق مختلف.
استخدام واجهة Cipher منخفضة المستوى
للتشفير المتدفق أو التشفير داخل المكان، استخدموا واجهة Cipher مع نمط GCM مباشرةً:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())مقاومة إساءة استخدام Nonce: AES-GCM-SIV
يتميز AES-GCM-SIV (RFC 8452) بمقاومة إساءة استخدام nonce: إذ تكشف إعادة استخدام nonce أن نصين واضحين متطابقان، لكنها لا تكسر الأصالة. فضّلوه عندما يصعب ضمان تفرد nonce.
اشتقاق المفتاح قبل التشفير
لا تستخدموا كلمة مرور خامًا مفتاحًا لـ AES مطلقًا. اشتقوا مفتاحًا باستخدام Argon2 أو HKDF:
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os
master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())اعتبارات الأداء
يجعل تسريع AES-NI العتادي AES-GCM سريعًا للغاية (نحو 1–4 GB/s على وحدات المعالجة المركزية الحديثة). تستخدم Python cryptography مكتبة OpenSSL التي تستفيد من AES-NI. وبالنسبة إلى الملفات الأكبر من 100 MB، استخدموا البث على دفعات مع واجهة Cipher منخفضة المستوى.
اختبار المعرفة
ماذا يحدث إذا استُخدمت قيمة nonce نفسها مرتين مع AES-GCM تحت المفتاح نفسه؟
مراجعة الدرس
يوفر AES-GCM تشفيرًا موثّقًا في تمريرة واحدة. استخدموا nonce عشوائية جديدة ذات 96 بت لكل عملية تشفير. أضيفوا nonce إلى بداية النص المشفّر عند التخزين. تربط AAD النص المشفّر بسياقه. ويقاوم AES-GCM-SIV إساءة استخدام nonce. اشتقوا المفاتيح باستخدام HKDF، ولا تستخدموا كلمات المرور الخام مطلقًا.
تعلم Cryptology Academy مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 67
- الدروس
- 261
الأسئلة الشائعة
هل درس «تشفير AES-GCM وفك تشفيره في Python» مجاني؟
نعم — نص درس «تشفير AES-GCM وفك تشفيره في Python» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cryptology Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
ماذا ستتعلم في «تشفير AES-GCM وفك تشفيره في Python»؟
نفّذ تشفيرًا موثَّقًا مع إدارة سليمة لـ nonce تتمرن على Cryptology Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cryptology Academy؟
لا تُشترط خبرة سابقة. Cryptology Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تشفير AES-GCM وفك تشفيره في Python»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cryptology Academy هذا؟
نعم. كل درس في Cryptology Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على مكتبة Python cryptography
- تشفير AES-GCM وفك تشفيره في Python
- أزواج مفاتيح RSA وECDSA في Python
- أخطاء التشفير الشائعة في Python والأنماط الآمنة