التشفير في 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 أيضاً في المكتبة
Event Bus ونمط Observer في Java: تنفيذ بنية غير مترابطة
التعلم الآلي في Java: نظرة عامة على المكتبات الرئيسية للتطوير
توليد تقارير PDF باستخدام PHP: نظرة عامة على المكتبات وأمثلة الكود