2013-07-28 3 views
-1
#include <stdio.h> 
#include <string.h> 
#include <openssl/sha.h> 
#include <string.h> 
#include <iostream> 
#include <stdlib.h> 
#include <sstream> 

using namespace std; 

int main() 
{ 
std::stringstream ss; 

    std::string data; 
    data = "hello worl"; 
    unsigned char digest[SHA_DIGEST_LENGTH]; 
    char *string1 = strdup(data.c_str()); 


    SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);  

    char mdString[SHA_DIGEST_LENGTH*2+1]; 

    for(int i = 0; i < SHA_DIGEST_LENGTH; i++) 
     sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]); 

ss.str(""); 
ss << mdString; 

cout << ss.str() << std::endl; 

    // do stuff with string1 
    free(string1); 
    return 0; 
} 

Выход:C++ Ша возвращают другое значение каждый раз

[email protected]:~/yes/coding$ g++ -o sha sha.cpp -lcrypto 
[email protected]:~/yes/coding$ ./sha 
1bc8b06c5cd4e774195293ea00c959173d8d3789 
[email protected]:~/yes/coding$ ./sha 
c8cf70c522fc564aedb5894a24613542702172ca 
[email protected]:~/yes/coding$ ./sha 
83fbda098c3549ab1347d6cf708ac85092200423 
[email protected]:~/yes/coding$ ./sha 
ea6ccffd78236e22da412ed90a852329f59f8fd5 
[email protected]:~/yes/coding$ ./sha 
0413799befebcb23f5a5c970e48febc7f1aa27fb 
[email protected]:~/yes/coding$ ./sha 
7bd8e7952c78e282b8c117f8c537c456b66207d9 
+0

Быстрый вопрос: что произойдет, если вы включите предупреждения ('-Wall')? –

ответ

4
SHA1((unsigned char*)&string1, ...) 

падения амперсанд. Вы не хешируете текст, который хотите хешировать; вы хэшируете четыре байта, которые формируют адрес первого символа строки, плюс шесть байтов случайного мусора, которые сидят выше string1 в стеке.

Смежные вопросы