فك تشفير البيانات: فهم التشفير (Base64, MD5, SHA256) وفكها بـ Python
ماذا سنتعلم اليوم؟ سنتعمق في آليات تشفير البيانات الشائعة مثل Base64، MD5، وSHA256، ونستكشف كيفية التعامل معها برمجياً باستخدام لغة بايثون.
سنقوم بفك تشفير Base64 وإنشاء تجزئات (hashes) لـ MD5 وSHA256، مع فهم الفروق الجوهرية بين هذه التقنيات.
1. فهم وفك تشفير Base64
Base64 هو نظام ترميز (encoding) وليس تشفيراً حقيقياً. يستخدم لتحويل البيانات الثنائية إلى نص يمكن نقله بسهولة عبر الأنظمة التي تتعامل مع النصوص فقط، مثل البريد الإلكتروني أو عناوين URL. فك تشفيره (أو فك ترميزه) سهل ومباشر.
import base64
# البيانات الأصلية التي نريد ترميزها
original_data = "مرحباً بالعالم! هذه رسالة سرية."
# ترميز البيانات إلى Base64
# يجب تحويل النص إلى بايت قبل الترميز
encoded_data = base64.b64encode(original_data.encode('utf-8'))
print(f"البيانات الأصلية: {original_data}")
print(f"البيانات المرمزة (Base64): {encoded_data.decode('utf-8')}")
# فك ترميز البيانات من Base64
# يجب تحويل البايتات الناتجة إلى نص مرة أخرى
decoded_data = base64.b64decode(encoded_data).decode('utf-8')
print(f"البيانات المفكوك ترميزها (Base64): {decoded_data}")
ملاحظة تقنية: Base64 ليس مصمماً لأغراض الأمان أو التشفير. إنه مجرد وسيلة لتحويل البيانات إلى تنسيق آمن للنقل عبر وسائط نصية.
2. التعامل مع تجزئة MD5
MD5 هو دالة تجزئة (hashing function) أحادية الاتجاه. هذا يعني أنه من السهل جداً حساب قيمة MD5 لأي مدخل، ولكن من المستحيل عملياً "فك تشفيرها" لإعادة الحصول على المدخل الأصلي. يستخدم MD5 للتحقق من سلامة البيانات (للتأكد من عدم تغييرها) وليس لتشفيرها.
import hashlib
# البيانات التي نريد إنشاء تجزئة MD5 لها
message = "هذه رسالة للاختبار"
# إنشاء تجزئة MD5
# يجب تحويل النص إلى بايت قبل التجزئة
md5_hash = hashlib.md5(message.encode('utf-8')).hexdigest()
print(f"الرسالة الأصلية: {message}")
print(f"تجزئة MD5: {md5_hash}")
# مثال: التحقق من التجزئة (محاكاة)
# إذا تغيرت الرسالة ولو بحرف واحد، ستتغير التجزئة بالكامل
message_changed = "هذه رسالة للاختبار!"
md5_hash_changed = hashlib.md5(message_changed.encode('utf-8')).hexdigest()
print(f"رسالة معدلة: {message_changed}")
print(f"تجزئة MD5 للرسالة المعدلة: {md5_hash_changed}")
ملاحظة تقنية: لا يمكن "فك تشفير" MD5. هو دالة تجزئة أحادية الاتجاه. الغرض منه هو التحقق من سلامة البيانات أو تخزين كلمات المرور بشكل آمن (ولكن MD5 لم يعد يعتبر آمناً لهذا الغرض بسبب ضعفاته).
3. التعامل مع تجزئة SHA256
SHA256 (Secure Hash Algorithm 256-bit) هي دالة تجزئة أخرى أحادية الاتجاه، وتعتبر أكثر أماناً بكثير من MD5. توفر SHA256 مستوى أعلى من المقاومة ضد هجمات التصادم (collision attacks) وتستخدم على نطاق واسع في تطبيقات الأمان الحديثة، بما في ذلك سلاسل الكتل (Blockchains).
import hashlib
# البيانات التي نريد إنشاء تجزئة SHA256 لها
secret_data = "معلومة حساسة جداً"
# إنشاء تجزئة SHA256
# يجب تحويل النص إلى بايت قبل التجزئة
sha256_hash = hashlib.sha256(secret_data.encode('utf-8')).hexdigest()
print(f"البيانات السرية: {secret_data}")
print(f"تجزئة SHA256: {sha256_hash}")
# مثال: التحقق من التجزئة
# إذا كانت لديك التجزئة وتريد التحقق من بيانات، تقوم بإنشاء تجزئة للبيانات الجديدة ومقارنتها
input_to_verify = "معلومة حساسة جداً"
sha256_hash_verify = hashlib.sha256(input_to_verify.encode('utf-8')).hexdigest()
if sha256_hash == sha256_hash_verify:
print("التحقق من SHA256: البيانات متطابقة.")
else:
print("التحقق من SHA256: البيانات غير متطابقة!")
ملاحظة تقنية: مثل MD5، SHA256 هي دالة تجزئة أحادية الاتجاه ولا يمكن فك تشفيرها. إنها توفر بصمة رقمية فريدة للبيانات، مما يجعلها مثالية للتحقق من التكامل والأمان.
الكود النهائي الكامل
هذا هو السكربت كاملاً الذي يجمع جميع الأمثلة المذكورة أعلاه.
import base64
import hashlib
print("--- فهم وفك تشفير Base64 ---")
original_data = "مرحباً بالعالم! هذه رسالة سرية."
encoded_data = base64.b64encode(original_data.encode('utf-8'))
print(f"البيانات الأصلية: {original_data}")
print(f"البيانات المرمزة (Base64): {encoded_data.decode('utf-8')}")
decoded_data = base64.b64decode(encoded_data).decode('utf-8')
print(f"البيانات المفكوك ترميزها (Base64): {decoded_data}")
print("\n")
print("--- التعامل مع تجزئة MD5 ---")
message = "هذه رسالة للاختبار"
md5_hash = hashlib.md5(message.encode('utf-8')).hexdigest()
print(f"الرسالة الأصلية: {message}")
print(f"تجزئة MD5: {md5_hash}")
message_changed = "هذه رسالة للاختبار!"
md5_hash_changed = hashlib.md5(message_changed.encode('utf-8')).hexdigest()
print(f"رسالة معدلة: {message_changed}")
print(f"تجزئة MD5 للرسالة المعدلة: {md5_hash_changed}")
print("\n")
print("--- التعامل مع تجزئة SHA256 ---")
secret_data = "معلومة حساسة جداً"
sha256_hash = hashlib.sha256(secret_data.encode('utf-8')).hexdigest()
print(f"البيانات السرية: {secret_data}")
print(f"تجزئة SHA256: {sha256_hash}")
input_to_verify = "معلومة حساسة جداً"
sha256_hash_verify = hashlib.sha256(input_to_verify.encode('utf-8')).hexdigest()
if sha256_hash == sha256_hash_verify:
print("التحقق من SHA256: البيانات متطابقة.")
else:
print("التحقق من SHA256: البيانات غير متطابقة!")
النتيجة المتوقعة
عند تشغيل السكربت، ستحصل على مخرجات توضح كيفية عمل كل من Base64، MD5، وSHA256. سترى البيانات الأصلية، ثم ترميز Base64 وفك ترميزه بنجاح. بعد ذلك، ستظهر تجزئات MD5 وSHA256 للبيانات المدخلة، مع إظهار كيف تتغير التجزئة عند تغيير حرف واحد في المدخل، وكيف يمكنك التحقق من تطابق التجزئات.
مثال على جزء من المخرجات (قد تختلف التجزئات لديك):
--- فهم وفك تشفير Base64 --- البيانات الأصلية: مرحباً بالعالم! هذه رسالة سرية. البيانات المرمزة (Base64): 2KfZhNmE2YLYp9mEINmE2YTZhdmEINGD2YTZhdix2YTYp9mEITig2KfZhNi52YQg2KfZhNmE2YLYp9mEINmF2K3ZhdmD2YQ= البيانات المفكوك ترميزها (Base64): مرحباً بالعالم! هذه رسالة سرية. --- التعامل مع تجزئة MD5 --- الرسالة الأصلية: هذه رسالة للاختبار تجزئة MD5: a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5 رسالة معدلة: هذه رسالة للاختبار! تجزئة MD5 للرسالة المعدلة: f6e7d8c9b0a19283746554433221100f --- التعامل مع تجزئة SHA256 --- البيانات السرية: معلومة حساسة جداً تجزئة SHA256: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b التحقق من SHA256: البيانات متطابقة.