2014-02-13 178 views
1

我无法使用OpenSSL获取md5散列。我使用下面的命令编译:无法获取md5散列

gcc -Wall test_3.c -o test_3 -lcrypto -lssl 

但得到以下链接错误:

undefined reference to `MD5Init' 
undefined reference to `MD5Update' 
undefined reference to `MD5Final' 
collect2: ld returned 1 exit status 

该方案低于目前:

#include<stdio.h> 
#include<string.h> 
#include <openssl/hmac.h> 
#include <openssl/md5.h> 

int main() 
{ 
    char digest[17]; 
    char input[] = "asdfljiahfbqhebfjcnajclgfeliuaef"; 
    int length = strlen(input); 

    MD5_CTX md5; 

    MD5Init(&md5); 
    MD5Update(&md5,input, length); 
    MD5Final(digest,&md5); 
    printf("digest is %s \n",digest); 

    return 0; 
} 

请让我知道,如果你知道问题。请帮助我

回答

3

你犯了一些错误,我纠正了它们。我也添加了哈希的十六进制输出。否则它会破坏你的终端。

#include <stdio.h> 
#include <string.h> 
#include <openssl/hmac.h> 
#include <openssl/md5.h> 

int main() 
{ 
    // use unsigned char 
    unsigned char digest[16]; 
    char *input = "hek2mgl"; 
    int length = strlen(input); 
    int i=0; 

    // don't miss the underscore after MD5 
    MD5_CTX md5;  
    MD5_Init(&md5); 

    while (length > 0) { 
     if (length > 512) { 
      MD5_Update(&md5, input, 512); 
     } else { 
      MD5_Update(&md5, input, length); 
     } 
     length -= 512; 
     input += 512; 
    } 

    MD5_Final(digest, &md5); 
    printf("digest is: "); 
    for(i = 0; i < 16; i++) { 
     printf("%02x", digest[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

输出:

digest is: 1ff8a3b2958ee3340ed88a2b980a8099 
+0

相信与否,误拼写功能的一个示出的grep OpenSSL提供了它们作为' /演示/发动机/ RSAREF/rsaref.c'演示代码。 – jww

+0

让我检查:) .... – hek2mgl

3

除了hek2mgl的回答,OpenSSL的维基在EVP Message Digests提供下面的例子。

建议使用EVP_*接口,特别是对于那些不熟悉OpenSSL的一些特性和怪癖(这可能是件好事)的用户。而不是EVP_sha256(),只需使用EVP_md5()

void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len) 
{ 
    EVP_MD_CTX *mdctx; 

    if((mdctx = EVP_MD_CTX_create()) == NULL) 
     handleErrors(); 

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL)) 
     handleErrors(); 

    if(1 != EVP_DigestUpdate(mdctx, message, strlen(message))) 
     handleErrors(); 

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL) 
     handleErrors(); 

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len)) 
     handleErrors(); 

    EVP_MD_CTX_destroy(mdctx); 
} 
+0

+1给予替代!现在我没有太多的C代码练习。我刚刚纠正了错误的乐趣。 :)也许你的尝试更好... – hek2mgl