التشفير في C++: التشفير والتجزئة — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التشفير في C++: التشفير والتجزئة — دليل شامل



التشفير هو الأساس الجوهري لأمان التطبيقات الحديثة. في لغة C++، تتوفر للمطورين مكتبات قوية تتيح تنفيذ تشفير وفك تشفير وتجزئة البيانات. في هذه المقالة، سنستعرض بالتفصيل مكتبتين شائعتين: OpenSSL و Crypto++، وسنشرح المفاهيم الأساسية: التشفير المتماثل (AES)، والتشفير غير المتماثل (RSA)، ودوال التجزئة التشفيرية (SHA-256).



1. المفاهيم الأساسية للتشفير



قبل الانتقال إلى الكود، من المهم فهم المصطلحات الأساسية:

  • التشفير المتماثل — يُستخدم مفتاح واحد لكل من التشفير وفك التشفير. أمثلة: AES، DES، ChaCha20.
  • التشفير غير المتماثل — زوج من المفاتيح: مفتاح عام (للتشفير) ومفتاح خاص (لفك التشفير). أمثلة: RSA، ECC.
  • دوال التجزئة — تحويل غير قابل للعكس للبيانات إلى سلسلة ذات طول ثابت. أمثلة: SHA-256، MD5 (قديم)، BLAKE2.
  • الملح (salt) — بيانات عشوائية تُضاف إلى كلمة المرور قبل التجزئة للحماية من جداول قوس قزح.


2. مكتبة OpenSSL في C++



OpenSSL هي مكتبة مفتوحة المصدر متعددة المنصات، تنفذ بروتوكولات SSL/TLS ومجموعة واسعة من خوارزميات التشفير. للعمل معها في C++، يجب تضمين ملفات الرأس والربط مع المكتبات libssl و libcrypto.



مثال 1: تجزئة SHA-256 باستخدام OpenSSL



#include <iostream>#include <openssl/sha.h>#include <cstring>

std::string sha256(const std::string& input) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.length()); SHA256_Final(hash, &sha256);

std::string output; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { char buf[3]; sprintf(buf, "%02x", hash[i]); output += buf; } return output;}

int main() { std::string data = "PythonLib - التشفير في C++"; std::cout << "SHA-256: " << sha256(data) << std::endl; return 0;}


يوضح هذا الكود الاستخدام الأساسي لسياق SHA256. الدالة SHA256_Init تهيئ السياق، و SHA256_Update تضيف البيانات (يمكن استدعاؤها عدة مرات للمعالجة المتدفقة)، و SHA256_Final تنهي الحساب وتكتب النتيجة.



مثال 2: التشفير المتماثل AES-256-CBC



#include <iostream>#include <openssl/evp.h>#include <vector>#include <cstring>

std::vector<unsigned char> aes_encrypt(const std::string& plaintext, const unsigned char* key, const unsigned char* iv) { EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, iv);

std::vector<unsigned char> ciphertext(plaintext.size() + EVP_CIPHER_block_size(EVP_aes_256_cbc())); int len = 0; int ciphertext_len = 0;

EVP_EncryptUpdate(ctx, ciphertext.data(), &len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.size()); ciphertext_len = len;

EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len); ciphertext_len += len; ciphertext.resize(ciphertext_len);

EVP_CIPHER_CTX_free(ctx); return ciphertext;}

int main() { // مفتاح 256 بت (32 بايت) و IV 128 بت (16 بايت) unsigned char key[32] = "01234567890123456789012345678901"; unsigned char iv[16] = "0123456789012345";

std::string message = "بيانات سرية لـ PythonLib"

توصيات