أزواج مفاتيح RSA وECDSA في Python
أنشئ مفاتيح RSA وEC وتسلسلها واستخدمها للتوقيع والتشفير
أزواج مفاتيح RSA وECDSA في Python درس مجاني في Cryptology Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cryptology Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
نظرة عامة على عمليات أزواج المفاتيح
تدعم مكتبة cryptography في Python RSA وECDSA لإنشاء المفاتيح والتوقيع والتحقق والتسلسل والتحميل. وتُعد هذه اللبنات الأساسية لشهادات TLS وتوقيع التعليمات البرمجية وJWTs.
إنشاء زوج مفاتيح RSA
الحد الأدنى الموصى به: 2048 بت للتوافق، و4096 بت للمفاتيح طويلة الأمد:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
print("RSA key generated, size:", private_key.key_size, "bits")التوقيع باستخدام RSA-PSS
استخدموا دائمًا حشو PSS للتوقيعات (وليس PKCS#1 v1.5):
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
message = b"document to sign"
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("RSA-PSS signature:", signature.hex()[:32], "...")التحقق من توقيع RSA
يُطلق التحقق InvalidSignature عند الفشل:
from cryptography.exceptions import InvalidSignature
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature valid!")
except InvalidSignature:
print("Signature INVALID")إنشاء زوج مفاتيح ECDSA
يوفر ECDSA باستخدام NIST P-256 (secp256r1) أمانًا بمستوى 128 بت مع مفاتيح أصغر بكثير من RSA-3072:
from cryptography.hazmat.primitives.asymmetric import ec
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
print("EC private key generated on curve:", private_key.curve.name)التوقيع والتحقق باستخدام ECDSA
يستخدم ECDSA توقيعات بترميز DER افتراضيًا:
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature
# Sign
sig = private_key.sign(b"my data", ec.ECDSA(hashes.SHA256()))
print("ECDSA signature bytes:", len(sig))
# Verify
try:
public_key.verify(sig, b"my data", ec.ECDSA(hashes.SHA256()))
print("ECDSA signature valid")
except InvalidSignature:
print("Invalid")تسلسل المفاتيح إلى PEM
احفظوا المفاتيح في ملفات PEM لتخزينها أو توزيعها:
from cryptography.hazmat.primitives import serialization
# Private key — encrypted with passphrase
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(b"strong-passphrase")
)
# Public key — no encryption
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_pem.decode()[:64])تحميل المفاتيح من PEM
حمّلوا المفاتيح المحفوظة إلى كائنات مجددًا:
from cryptography.hazmat.primitives.serialization import (
load_pem_private_key, load_pem_public_key
)
with open("ec_private.pem", "rb") as f:
priv = load_pem_private_key(f.read(), password=b"strong-passphrase")
with open("ec_public.pem", "rb") as f:
pub = load_pem_public_key(f.read())
print("Loaded EC key curve:", priv.curve.name)اتفاق المفاتيح باستخدام ECDH
استخدموا ECDH لاشتقاق سر مشترك للتشفير المتماثل:
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
alice_priv = ec.generate_private_key(ec.SECP256R1())
bob_priv = ec.generate_private_key(ec.SECP256R1())
# Alice computes shared secret
shared = alice_priv.exchange(ec.ECDH(), bob_priv.public_key())
aes_key = HKDF(hashes.SHA256(), 32, None, b"app-context").derive(shared)
print("Derived AES key:", aes_key.hex())تشفير RSA باستخدام OAEP
لتشفير حمولات صغيرة (مثل DEK) باستخدام RSA — استخدموا OAEP دائمًا:
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# Encrypt with public key
ciphertext = public_key.encrypt(
b"small secret",
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Decrypt with private key
plaintext = private_key.decrypt(ciphertext, padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None
))
print("Decrypted:", plaintext)اختيار RSA أم ECDSA
ECDSA: توقيعات أصغر (نحو 71 بايتًا لـ P-256 مقابل نحو 256 بايتًا لـ RSA-2048)، وتوقيع أسرع، مع مستوى الأمان نفسه. أما RSA: فيوفر دعمًا أوسع للأنظمة القديمة، ونموذجًا ذهنيًا أبسط. استخدموا ECDSA P-256 أو Ed25519 للأنظمة الجديدة.
اختبار المعرفة
لماذا ينبغي تفضيل RSA-PSS على PKCS#1 v1.5 للتوقيعات الرقمية؟
مراجعة الدرس
استخدموا rsa.generate_private_key لـ RSA، وec.generate_private_key لـ ECDSA. وقّعوا باستخدام PSS (مع RSA) أو ECDSA + SHA-256. وسلسلوا المفاتيح إلى PEM باستخدام تنسيق PKCS8 وتشفير بكلمة مرور. استخدموا ECDH لاتفاق المفاتيح. وفضّلوا ECDSA P-256 أو Ed25519 للأنظمة الجديدة.
الأسئلة الشائعة
هل درس «أزواج مفاتيح RSA وECDSA في Python» مجاني؟
نعم — نص درس «أزواج مفاتيح RSA وECDSA في Python» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cryptology Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
ماذا ستتعلم في «أزواج مفاتيح RSA وECDSA في Python»؟
أنشئ مفاتيح RSA وEC وتسلسلها واستخدمها للتوقيع والتشفير تتمرن على Cryptology Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cryptology Academy؟
لا تُشترط خبرة سابقة. Cryptology Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أزواج مفاتيح RSA وECDSA في Python»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cryptology Academy هذا؟
نعم. كل درس في Cryptology Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على مكتبة Python cryptography
- تشفير AES-GCM وفك تشفيره في Python
- أزواج مفاتيح RSA وECDSA في Python
- أخطاء التشفير الشائعة في Python والأنماط الآمنة