C++ में क्रिप्टोग्राफी: OpenSSL और Crypto++ के साथ एन्क्रिप्शन और हैश

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में क्रिप्टोग्राफी: OpenSSL और Crypto++ के साथ एन्क्रिप्शन और हैश

\n\n

डेटा की मजबूत सुरक्षा किसी भी आधुनिक एप्लिकेशन की बुनियादी आवश्यकता है। C++ डेवलपर्स को क्रिप्टोग्राफ़िक एल्गोरिदम को लागू करने के लिए शक्तिशाली उपकरण प्रदान करता है: सरल हैशिंग से लेकर जटिल असममित एन्क्रिप्शन योजनाओं तक। इस लेख में, हम दो सबसे लोकप्रिय लाइब्रेरी — OpenSSL और Crypto++ — पर चर्चा करेंगे और दिखाएंगे कि उनकी मदद से सामान्य कार्यों को कैसे हल किया जाए: हैशिंग, सममित एन्क्रिप्शन (AES) और असममित एन्क्रिप्शन (RSA)।

\n\n

1. OpenSSL: सार्वभौमिक क्रिप्टो प्रदाता

\n

OpenSSL C/C++ पर क्रिप्टोग्राफी के लिए वास्तविक मानक है। लाइब्रेरी सभी प्रमुख एल्गोरिदम, X.509 प्रमाणपत्र और TLS प्रोटोकॉल का समर्थन करती है। काम करने के लिए, आपको libssl-dev पैकेज (Linux) स्थापित करना होगा या Windows के लिए बाइनरी बिल्ड डाउनलोड करने होंगे।

\n\n

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\n

1.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 के माध्यम से समान रूप से किया जाता है।

\n\n

1.3 असममित एन्क्रिप्शन RSA

\n

RSA का उपयोग कुंजियों के आदान-प्रदान या डेटा पर हस्ताक्षर करने के लिए किया जाता है। कुंजी जोड़ी उत्पन्न करना:

\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\n

2. Crypto++: C++-उन्मुख विकल्प

\n

Crypto++ (Wei Dai लाइब्रेरी) C++ के लिए अधिक 'देशी' इंटरफ़ेस प्रदान करता है: टेम्पलेट, RAII, स्ट्रीम। इसे बाहरी निर्भरता की आवश्यकता नहीं है।

\n\n

2.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                    

अनुशंसाएँ