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

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

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

ابدأ الدورة

التشفير في C++: من النظرية إلى تطبيق التشفير والتجزئة



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



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

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

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


1. العمل مع OpenSSL في C++

OpenSSL هي مكتبة متعددة المنصات بلغة C، متاحة عبر الربط. التثبيت: sudo apt install libssl-dev (لينكس) أو عبر vcpkg/conan لنظام ويندوز.



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

#include <iostream>#include <string>#include <openssl/evp.h>#include <openssl/rand.h>

std::string 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::string ciphertext(plaintext.size() + 16, '\\0'); int len = 0, ciphertext_len = 0; EVP_EncryptUpdate(ctx, reinterpret_cast<unsigned char*>(&ciphertext[0]), &len, reinterpret_cast<const unsigned char*>(plaintext.data()), plaintext.size()); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, reinterpret_cast<unsigned char*>(&ciphertext[ciphertext_len]), &len); ciphertext_len += len; ciphertext.resize(ciphertext_len); EVP_CIPHER_CTX_free(ctx); return ciphertext;}

int main() { unsigned char key[32], iv[16]; RAND_bytes(key, sizeof(key)); // توليد مفتاح عشوائي RAND_bytes(iv, sizeof(iv));

std::string data = "رسالة سرية"; std::string encrypted = aes_encrypt(data, key, iv); std::cout << "مشفر: " << encrypted.size() << " بايت" << std::endl; return 0;}


تجزئة SHA-256 عبر OpenSSL

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

std::string sha256(const std::string& str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.c_str(), str.size()); 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::cout << "SHA-256: " << sha256("Hello, Crypto!") << std::endl; return 0;}


2. مكتبة Crypto++ (تطبيق C++ خالص)

Crypto++ (cryptopp) هي مكتبة كاملة بلغة C++ بدون تبعيات خارجية. التثبيت: sudo apt install libcrypto++-dev أو التحميل من cryptopp.com.



مثال: تشفير RSA باستخدام Crypto++

#include <iostream>#include <string>#include <cryptopp/rsa.h>#include <cryptopp/osrng.h>#include <cryptopp/base64.h>

int main() { using namespace CryptoPP;

AutoSeededRandomPool rng; Inve

توصيات