التشفير في C++: التشفير والتجزئة باستخدام OpenSSL و Crypto++

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

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

ابدأ الدورة

التشفير في C++: التشفير والتجزئة باستخدام OpenSSL و Crypto++



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



1. OpenSSL: مزود تشفير شامل

OpenSSL هو المعيار الفعلي للتشفير في C/C++. تدعم المكتبة جميع الخوارزميات الرئيسية، وشهادات X.509، وبروتوكولات TLS. للعمل، ستحتاج إلى تثبيت الحزمة libssl-dev (لينكس) أو تنزيل الإصدارات الثنائية لنظام ويندوز.



1.1 تجزئة SHA-256

أبسط مهمة هي حساب تجزئة سلسلة نصية. نستخدم واجهة برمجة التطبيقات منخفضة المستوى (EVP).

#include <iostream>#include <openssl/evp.h>#include <iomanip>

std::string sha256(const std::string& str) { EVP_MD_CTX* ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr); EVP_DigestUpdate(ctx, str.data(), str.size());

unsigned char hash[EVP_MAX_MD_SIZE]; unsigned int hash_len; EVP_DigestFinal_ex(ctx, hash, &hash_len); EVP_MD_CTX_free(ctx);

std::stringstream ss; for (unsigned int i = 0; i < hash_len; ++i) ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; return ss.str();}

int main() { std::cout << sha256("Hello, Crypto!") << std::endl; return 0;}


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

لتشفير البيانات بمفتاح واحد، نستخدم AES في وضع CBC. هام: يجب أن يكون المفتاح و IV (متجه التهيئة) عشوائيين.

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

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

std::vector<unsigned char> ciphertext(plaintext.size() + 16); int out_len, tmp_len; EVP_EncryptUpdate(ctx, ciphertext.data(), &out_len, plaintext.data(), plaintext.size()); EVP_EncryptFinal_ex(ctx, ciphertext.data() + out_len, &tmp_len); out_len += tmp_len; ciphertext.resize(out_len);

EVP_CIPHER_CTX_free(ctx); return ciphertext;}

يتم فك التشفير بالمثل باستخدام EVP_DecryptInit_ex و EVP_DecryptUpdate.



1.3 التشفير غير المتماثل RSA

يستخدم RSA لتبادل المفاتيح أو توقيع البيانات. توليد زوج المفاتيح:

#include <openssl/rsa.h>#include <openssl/pem.h>

RSA* generate_rsa_keypair(int bits = 2048) { RSA* rsa = RSA_new(); BIGNUM* e = BN_new(); BN_set_word(e, 65537); RSA_generate_key_ex(rsa, bits, e, nullptr); BN_free(e); return rsa;}

// حفظ المفتاح العام بصيغة PEMvoid save_public_key(RSA* rsa, const char* filename) { BIO* bio = BIO_new_file(filename, "w"); PEM_write_bio_RSA_PUBKEY(bio, rsa); BIO_free(bio);}


2. Crypto++: بديل موجه لـ C++

تقدم Crypto++ (مكتبة Wei Dai) واجهة أكثر "أصالة" لـ C++: قوالب، RAII، تدفقات. لا تتطلب تبعيات خارجية.



2.1 تجزئة SHA-256 في Crypto++

#include <cryptopp/sha.h>#include <cryptopp/hex.h>#include <iostream>

std::string sha256_cryptopp(const std::string& msg) { CryptoPP::SHA256 hash; byte digest[Cr

توصيات