2010-02-14 22 views
49

मैं openssl और सी का उपयोग कर ++ SHA256 साथ एक हैश बनाने के लिए देख रहा हूँ उत्पन्न करें। मुझे पता है कि Generate SHA hash in C++ using OpenSSL library पर एक समान पोस्ट है, लेकिन मैं विशेष रूप से sha256 बनाना चाहता हूं।OpenSSL साथ SHA256 और सी ++

अद्यतन:

शामिल रास्तों के साथ एक समस्या लगती है। यह किसी भी OpenSSL कार्यों नहीं मिल सकता है, भले ही मैं

#include "openssl/sha.h" 

शामिल है और मैं अपने निर्माण में पथ शामिल

-I/opt/ssl/include/ -L/opt/ssl/lib/ -lcrypto 
+0

इसके अलावा एक बोनस के रूप में, यह अगर यह बाइनरी में उत्पादन हैश होगा अच्छा होगा :) –

+1

मैं वहाँ एक नया उत्तर पोस्ट जो बताते हैं कि आप क्या चाहते। यदि आप उत्तर में मदद करते हैं तो आप इस प्रश्न को डुप्लिकेट के रूप में बंद कर सकते हैं। – AndiDog

+0

@AndiDog - सब कुछ सही काम करने लगता है, सिवाय इसके कि संकलक कार्यों को नहीं ढूंढ सकता है। इसे SHA1 का संदर्भ भी नहीं मिला। 'SHA256_Final' जैसे SHA256 फ़ंक्शंस में से कोई भी नहीं मिला। सुनिश्चित नहीं हैं कि मैं गलत क्या कर रहा है, मैं #include "openssl/sha.h" शामिल है और मैं संकलन मैं/opt/ssl/शामिल/एल/opt/ssl/lib दौरान शामिल हैं और पुस्तकालय शामिल/ –

उत्तर

58

यहां बताया गया है मैंने किया:

void sha256(char *string, char outputBuffer[65]) 
{ 
    unsigned char hash[SHA256_DIGEST_LENGTH]; 
    SHA256_CTX sha256; 
    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, string, strlen(string)); 
    SHA256_Final(hash, &sha256); 
    int i = 0; 
    for(i = 0; i < SHA256_DIGEST_LENGTH; i++) 
    { 
     sprintf(outputBuffer + (i * 2), "%02x", hash[i]); 
    } 
    outputBuffer[64] = 0; 
} 

int sha256_file(char *path, char outputBuffer[65]) 
{ 
    FILE *file = fopen(path, "rb"); 
    if(!file) return -534; 

    byte hash[SHA256_DIGEST_LENGTH]; 
    SHA256_CTX sha256; 
    SHA256_Init(&sha256); 
    const int bufSize = 32768; 
    byte *buffer = malloc(bufSize); 
    int bytesRead = 0; 
    if(!buffer) return ENOMEM; 
    while((bytesRead = fread(buffer, 1, bufSize, file))) 
    { 
     SHA256_Update(&sha256, buffer, bytesRead); 
    } 
    SHA256_Final(hash, &sha256); 

    sha256_hash_string(hash, outputBuffer); 
    fclose(file); 
    free(buffer); 
    return 0; 
} 

यह ग है इस तरह alled:

static unsigned char buffer[65]; 
sha256("string", buffer); 
printf("%s\n", buffer); 
+1

हाय, महान क्यूटी :) का उपयोग कर हर किसी के लिए इस्तेमाल किया , बस अपने प्रोजेक्ट फाइल 'LIBS + = करने के लिए जोड़ - lcrypto' और फिर तुम सिर्फ एक वर्ग के लिए कोड में बदल सकते हैं और सब कुछ ठीक काम करेंगे;) – TCB13

+3

-1:" SHA1_Init(), SHA1_Update() और SHA1_Final() वापसी 1 सफलता के लिए, 0 अन्यथा। ", http://www.openssl.org/docs/crypto/sha.htm। – jww

+0

@noloader अप्रासंगिक इन कार्यों का उपयोग यहां नहीं किया जाता है। –

1

मुझे लगता है कि आप केवल tatk कोड के साथ SHA256 समारोह के साथ SHA1 समारोह को बदलने के लिए है कि अपनी पोस्ट में लिंक से

2

एक और अधिक "सी ++" ish संस्करण

#include <iostream> 
#include <sstream> 

#include "openssl/sha.h" 

using namespace std; 

string to_hex(unsigned char s) { 
    stringstream ss; 
    ss << hex << (int) s; 
    return ss.str(); 
} 

string sha256(string line) {  
    unsigned char hash[SHA256_DIGEST_LENGTH]; 
    SHA256_CTX sha256; 
    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, line.c_str(), line.length()); 
    SHA256_Final(hash, &sha256); 

    string output = "";  
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { 
     output += to_hex(hash[i]); 
    } 
    return output; 
} 

int main() { 
    cout << sha256("hello, world") << endl; 

    return 0; 
} 
+1

-1 घोषित नहीं किया गया था: "SHA1_Init(), SHA1_Update() और SHA1_Final() वापसी सफलता के लिए 1, 0 अन्यथा। ", Openssl.org/docs/crypto/sha.htm। – jww

+3

सी-स्टाइल रिटर्न वैल्यू चेक के साथ कोड को अस्पष्ट नहीं करना चाहता था। DIY यदि आप – Max

+9

परवाह करते हैं तो "DIY यदि आप परवाह करते हैं" - आपको असुविधा के लिए खेद है। लोग अंधेरे से इसे कॉपी/पेस्ट करेंगे। वापसी मूल्यों को अनदेखा करना एक खतरनाक अभ्यास है, और इसे demonstarated नहीं किया जाना चाहिए (विशेष रूप से उच्च अखंडता कोड में)। – jww

30

एसटीडी आधारित

#include <iostream> 
#include <iomanip> 
#include <sstream> 
#include <string> 

using namespace std; 

#include <openssl/sha.h> 
string sha256(const 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); 
    stringstream ss; 
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) 
    { 
     ss << hex << setw(2) << setfill('0') << (int)hash[i]; 
    } 
    return ss.str(); 
} 

int main() { 
    cout << sha256("1234567890_1") << endl; 
    cout << sha256("1234567890_2") << endl; 
    cout << sha256("1234567890_3") << endl; 
    cout << sha256("1234567890_4") << endl; 
    return 0; 
} 
+3

इसका परीक्षण नहीं किया है, लेकिन यह निश्चित रूप से अन्य सभी "सी ++" संस्करणों की तुलना में क्लीनर दिखता है। –

+4

यह कोड अपेक्षित आउटपुट संकलित और उत्पादित करता है। उबंटू पर, आप इसका उपयोग कर सकते हैं: sudo apt-get libssl-dev && g ++ -lcrypto main.cc को संकलित करने के लिए इंस्टॉल करें। – Homer6

+1

यह समाधान वास्तव में स्वीकार किए गए एक से बेहतर है, क्योंकि ओस्ट्रिंगस्ट्रीम बहुत अधिक है, सरणी और 'sprintf' के साथ गड़बड़ करने से कहीं अधिक सुरक्षित है। – omni

5

का उपयोग OpenSSL के EVP interface (निम्नलिखित OpenSSL 1.1 के लिए है):

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

bool computeHash(const std::string& unhashed, std::string& hashed) 
{ 
    bool success = false; 

    EVP_MD_CTX* context = EVP_MD_CTX_new(); 

    if(context != NULL) 
    { 
     if(EVP_DigestInit_ex(context, EVP_sha256(), NULL)) 
     { 
      if(EVP_DigestUpdate(context, unhashed.c_str(), unhashed.length())) 
      { 
       unsigned char hash[EVP_MAX_MD_SIZE]; 
       unsigned int lengthOfHash = 0; 

       if(EVP_DigestFinal_ex(context, hash, &lengthOfHash)) 
       { 
        std::stringstream ss; 
        for(unsigned int i = 0; i < lengthOfHash; ++i) 
        { 
         ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; 
        } 

        hashed = ss.str(); 
        success = true; 
       } 
      } 
     } 

     EVP_MD_CTX_free(context); 
    } 

    return success; 
} 

int main(int, char**) 
{ 
    std::string pw1 = "password1", pw1hashed; 
    std::string pw2 = "password2", pw2hashed; 
    std::string pw3 = "password3", pw3hashed; 
    std::string pw4 = "password4", pw4hashed; 

    hashPassword(pw1, pw1hashed); 
    hashPassword(pw2, pw2hashed); 
    hashPassword(pw3, pw3hashed); 
    hashPassword(pw4, pw4hashed); 

    std::cout << pw1hashed << std::endl; 
    std::cout << pw2hashed << std::endl; 
    std::cout << pw3hashed << std::endl; 
    std::cout << pw4hashed << std::endl; 

    return 0; 
} 

का लाभ यह उच्च स्तरीय इंटरफ़ेस यह है कि आपको बस EVP_sha256() अन्य डायजेस्ट के फ़ंक्शन के साथ कॉल करने की आवश्यकता है, उदा। एक अलग डाइजेस्ट का उपयोग करने के लिए EVP_sha512()। तो यह कुछ लचीलापन जोड़ता है।