2014-02-13 4 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

실수를 저질렀습니다. 또한 해시의 16 진수 출력을 추가했습니다. 그렇지 않으면 터미널이 손상됩니다.

#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에서 다음 예제를 제공합니다.

특히 OpenSSL의 기능 및 단점 (좋은 점이있을 수 있음)에 익숙하지 않은 사용자를 위해 EVP_* 인터페이스를 사용하는 것이 좋습니다. 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

관련 문제