C++ में क्रिप्टोग्राफी: OpenSSL और Crypto++ के साथ एन्क्रिप्शन और हैश
\n\nडेटा की मजबूत सुरक्षा किसी भी आधुनिक एप्लिकेशन की बुनियादी आवश्यकता है। C++ डेवलपर्स को क्रिप्टोग्राफ़िक एल्गोरिदम को लागू करने के लिए शक्तिशाली उपकरण प्रदान करता है: सरल हैशिंग से लेकर जटिल असममित एन्क्रिप्शन योजनाओं तक। इस लेख में, हम दो सबसे लोकप्रिय लाइब्रेरी — OpenSSL और Crypto++ — पर चर्चा करेंगे और दिखाएंगे कि उनकी मदद से सामान्य कार्यों को कैसे हल किया जाए: हैशिंग, सममित एन्क्रिप्शन (AES) और असममित एन्क्रिप्शन (RSA)।
\n\n1. OpenSSL: सार्वभौमिक क्रिप्टो प्रदाता
\nOpenSSL C/C++ पर क्रिप्टोग्राफी के लिए वास्तविक मानक है। लाइब्रेरी सभी प्रमुख एल्गोरिदम, X.509 प्रमाणपत्र और TLS प्रोटोकॉल का समर्थन करती है। काम करने के लिए, आपको libssl-dev पैकेज (Linux) स्थापित करना होगा या Windows के लिए बाइनरी बिल्ड डाउनलोड करने होंगे।
1.1 SHA-256 हैशिंग
\nसबसे सरल कार्य — एक स्ट्रिंग का हैश निकालना। हम निम्न-स्तरीय API (EVP) का उपयोग करते हैं।
\n#include <iostream>\n#include <openssl/evp.h>\n#include <iomanip>\n\nstd::string sha256(const std::string& str) {\n EVP_MD_CTX* ctx = EVP_MD_CTX_new();\n EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr);\n EVP_DigestUpdate(ctx, str.data(), str.size());\n\n unsigned char hash[EVP_MAX_MD_SIZE];\n unsigned int hash_len;\n EVP_DigestFinal_ex(ctx, hash, &hash_len);\n EVP_MD_CTX_free(ctx);\n\n std::stringstream ss;\n for (unsigned int i = 0; i < hash_len; ++i)\n ss << std::hex << std::setw(2) << std::setfill('0') \n << (int)hash[i];\n return ss.str();\n}\n\nint main() {\n std::cout << sha256("Hello, Crypto!") << std::endl;\n return 0;\n}\n\n1.2 सममित एन्क्रिप्शन AES-256-CBC
\nएक कुंजी के साथ डेटा को एन्क्रिप्ट करने के लिए हम CBC मोड में AES का उपयोग करते हैं। महत्वपूर्ण: कुंजी और IV (इनिशियलाइज़ेशन वेक्टर) यादृच्छिक होने चाहिए।
\n#include <openssl/evp.h>\n#include <vector>\n\nstd::vector<unsigned char> aes_encrypt(\n const std::vector<unsigned char>& plaintext,\n const std::vector<unsigned char>& key,\n const std::vector<unsigned char>& iv) \n{\n EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();\n EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.data(), iv.data());\n\n std::vector<unsigned char> ciphertext(plaintext.size() + 16);\n int out_len, tmp_len;\n EVP_EncryptUpdate(ctx, ciphertext.data(), &out_len, plaintext.data(), plaintext.size());\n EVP_EncryptFinal_ex(ctx, ciphertext.data() + out_len, &tmp_len);\n out_len += tmp_len;\n ciphertext.resize(out_len);\n\n EVP_CIPHER_CTX_free(ctx);\n return ciphertext;\n}\nडिक्रिप्शन EVP_DecryptInit_ex और EVP_DecryptUpdate के माध्यम से समान रूप से किया जाता है।
1.3 असममित एन्क्रिप्शन RSA
\nRSA का उपयोग कुंजियों के आदान-प्रदान या डेटा पर हस्ताक्षर करने के लिए किया जाता है। कुंजी जोड़ी उत्पन्न करना:
\n#include <openssl/rsa.h>\n#include <openssl/pem.h>\n\nRSA* generate_rsa_keypair(int bits = 2048) {\n RSA* rsa = RSA_new();\n BIGNUM* e = BN_new();\n BN_set_word(e, 65537);\n RSA_generate_key_ex(rsa, bits, e, nullptr);\n BN_free(e);\n return rsa;\n}\n\n// सार्वजनिक कुंजी को PEM में सहेजना\nvoid save_public_key(RSA* rsa, const char* filename) {\n BIO* bio = BIO_new_file(filename, "w");\n PEM_write_bio_RSA_PUBKEY(bio, rsa);\n BIO_free(bio);\n}\n\n2. Crypto++: C++-उन्मुख विकल्प
\nCrypto++ (Wei Dai लाइब्रेरी) C++ के लिए अधिक 'देशी' इंटरफ़ेस प्रदान करता है: टेम्पलेट, RAII, स्ट्रीम। इसे बाहरी निर्भरता की आवश्यकता नहीं है।
\n\n2.1 Crypto++ में SHA-256 हैशिंग
\n#include <cryptopp/sha.h>\n#include <cryptopp/hex.h>\n#include <iostream>\n\nstd::string sha256_cryptopp(const std::string& msg) {\n CryptoPP::SHA256 hash;\n byte digest[Cr