2012-07-29 62 views
0

下面是我在openssl中創建哈希的代碼。 我想知道爲什麼我的輸出總是部分不一樣。openssl哈希產生部分不同的輸出 - C++ ubuntu

int main() 
{ 
    char alg[] = "MD5"; 
    char buf[EVP_MAX_KEY_LENGTH] = "5"; 
    unsigned char *testKey; 
    unsigned int olen; 

    testKey = simple_digest(alg, buf, EVP_MAX_KEY_LENGTH,&olen); 

    std::cout << "Printing key : >>"; 
    print_hex(testKey,EVP_MAX_KEY_LENGTH); 
    std::cout << "<<" << std::endl; 
} 

unsigned char *simple_digest(char *alg, char *buf, unsigned int len,unsigned int *olen) 
{ 
    const EVP_MD *m; 
    EVP_MD_CTX ctx; 
    unsigned char *ret; 
    OpenSSL_add_all_digests(); 

    if (!(m = EVP_get_digestbyname(alg))) 
     return NULL; 
    if (!(ret = (unsigned char *)malloc(EVP_MAX_MD_SIZE))) 
     return NULL; 


    EVP_DigestInit(&ctx, m); 
    EVP_DigestUpdate(&ctx, buf, len); 
    EVP_DigestFinal(&ctx, ret, olen); 

// std::cout << "computed key" << ret << std::endl; 

    return ret; 
} 

void print_hex(unsigned char *bs, unsigned int n) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
     printf("%02x", bs[i]); 
    printf("\n"); 
} 

輸出:

3afb8ebc9c93bf6d40285736f210b7856af8bab4d040ca090043ca09f840ca09 
3afb8ebc9c93bf6d40285736f210b7856af8bab490a5f909c0a7f909b8a5f909 

正如你可以看到只有後面幾個字符不同。

在此先感謝! :d


更新(正確的工作版本):

int main() 
{ 
    char alg[] = "MD5"; 
    char buf[EVP_MAX_KEY_LENGTH] = "5"; 
    unsigned char *testKey; 
    unsigned int olen; 

    testKey = simple_digest(alg, buf,strlen(buf),&olen); 

    std::cout << "Printing key : >>"; 
    print_hex(testKey,olen); 
    std::cout << "<<" << std::endl; 

} 

unsigned char *simple_digest(char *alg, char *buf, unsigned int len,unsigned int *olen) 
{ 
    const EVP_MD *m; 
    EVP_MD_CTX ctx; 
    unsigned char *ret; 
    OpenSSL_add_all_digests(); 

    if (!(m = EVP_get_digestbyname(alg))) 
     return NULL; 
    if (!(ret = (unsigned char *)malloc(EVP_MAX_KEY_LENGTH))) 
     return NULL; 

    EVP_DigestInit(&ctx, m); 
    EVP_DigestUpdate(&ctx, buf, len); 
    EVP_DigestFinal(&ctx, ret, olen); 

    return ret; 
} 

void print_hex(unsigned char *bs, unsigned int n) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
     printf("%02x", bs[i]); 
} 

輸出:

Printing key : >>e4da3b7fbbce2345d7772b0674a318d5<< 
+0

你的程序顯然不會產生你的輸出。我希望在一行上有「打印鍵:>>」,下一個是單個散列,第三個是「<<」。我假定你運行程序兩次,刪除非散列輸出?什麼是每次運行的輸入(即'buf'的值)? – chepner 2012-07-29 13:43:43

+0

@chepner嘿謝謝評論,我不知道如何去除非哈希輸出發生,但是我運行程序兩次。 buf的值將始終爲數字,例如5 – mister 2012-07-29 13:48:57

+0

您正在將流輸出與對'printf'的調用混合在一起。我不確定這是否被推薦,但已經很長時間了,因爲我已經完成了任何C++編程:) – chepner 2012-07-29 13:57:48

回答

4

您試圖散列一個字符的字符串, 「5」,但你告訴EVP_Digest_Update你的緩衝區長度是EVP_MAX_KEY_LENGTH。您需要傳遞緩衝區的實際長度,而不是它可能的最大長度。

爲了完整起見,這裏是你的主要功能應該是什麼樣子:

int main() 
{ 
    char alg[] = "MD5"; 
    char buf[EVP_MAX_KEY_LENGTH] = "5"; 
    unsigned char *testKey; 
    unsigned int olen; 

    # Pass the true length of but 
    testKey = simple_digest(alg, buf, strlen(buf), &olen); 

    std::cout << "Printing key : >>"; 
    # Pass the true length of testKey 
    print_hex(testKey,olen); 
    std::cout << "<<" << std::endl; 
} 

另外一個警告:你可能不希望使用EVP_MAX_KEY_LENGTH您的緩衝區,因爲這將限制該消息的大小你可以散列。

+0

我將該行更改爲\t \t testKey = simple_digest(alg,buf,sizeof(buf),&olen);但它仍然給我在後面相同的隨機輸出。無論如何感謝您的幫助!我發現我的錯誤,我已經填充它在下面::D – mister 2012-07-29 13:57:34

+1

sizeof(buf)返回字符指針的大小,而不是長度string指針指向 – chepner 2012-07-29 14:02:01

+0

hmm那麼我應該用什麼?strlen?它仍然不起作用:( – mister 2012-07-29 14:04:25