2013-01-12 4 views
1

sha1() 함수가 openssl/sha.h에서 작동하도록 노력하고 있습니다. 그러나 임의의 출력과 경고가 표시됩니다. 나는 꽤 많이 읽었고 몇 가지 예제 코드를 시도했지만 모든 것에 대해 경고를 받았고 제대로 표시되지 않습니다.C에서 SHA1 오류 구현

다음
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <openssl/sha.h> 

int main() 
{ 
const unsigned char data[] = "Hello, World"; 
unsigned long length = sizeof(data); 
unsigned char hash[SHA_DIGEST_LENGTH]; 
SHA1(data, length, hash); 
printf("%02x \n", hash); 
return 0; 

} 

내가 무엇입니까 경고입니다 : 여기

코드입니다

sha.c: In function ‘main’: 
sha.c:12: warning: ‘SHA1’ is deprecated (declared at /usr/include/openssl/sha.h:124) 
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’ 
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’ 

내가 그것을 실행하고 나는 출력을 얻을 때 : 62652b34

상관 도움이 될 것를 큰!

+1

를 길이가 정확한지 확인 : 당신이 당신의 버전을 사용하려면 당신은 진수로 각각의 문자를 인쇄 할 필요가있다.대부분의 경우, "Hello, World"의 길이는 12가되어야하지만, sizeof()가 ascii 문자를 세는 것처럼 13이라고 생각합니다. –

답변

2

나는 모든 것을 알아 내기 전에 시간이 좀 걸렸습니다. 가장 좋은 방법은 EVP를 사용하는 것입니다. 거의 모든 것에 대해 일반적인 기능을 제공합니다.

#include <openssl/evp.h> 

해시 함수를 호출하기 전에이 메신저를 호출해야합니다. 해시를 초기화합니다. 그렇지 않으면 openssl은 알고리즘을 사용할 수 없다고 불평 할 것입니다.

OpenSSL_add_all_algorithms(); 

모드는 문자열로 "SHA256", "SHA512", "SHA1"를해야합니다. dataToHash가 입력되고, dataSize 입력의 크기, 이미 해시가 기록 될 할당되어야 outHashed

unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) { 
    unsigned int md_len = -1; 
    const EVP_MD *md = EVP_get_digestbyname(mode); 
    if(NULL != md) { 
     EVP_MD_CTX mdctx; 
     EVP_MD_CTX_init(&mdctx); 
     EVP_DigestInit_ex(&mdctx, md, NULL); 
     EVP_DigestUpdate(&mdctx, dataToHash, dataSize); 
     EVP_DigestFinal_ex(&mdctx, outHashed, &md_len); 
     EVP_MD_CTX_cleanup(&mdctx); 
    } 
    return md_len; 
} 

이용 예 (이 테스트되지 않고, I ㄷ에서 위의 코드를 사용 ++ 래퍼)

const char *inData = "test data2"; 
unsigned char outHash[20]; // output is already allocated 
hash("SHA1", inData, 10, outHash); 

당신은 SHA1 저를 사용하지 말아야합니다 thod를 직접 사용하지 않는 것이 좋습니다 (코드가 다음 버전으로 날아갈 수 있습니다). 당신은 몇 가지 테스트 벤치 데이터에 결과를 비교하면,

int i; 
for(i=0; i<SHA_DIGEST_LENGTH; i++) { 
    printf("%02x", hash[i]); 
} 
+0

큰 도움에 감사드립니다. 나는 evp.h와 함께 더 이상 사용되지 않는 문제를 가지고있다. 내가 지금 다른 것과 다른 것을 사용하고 있다고 생각되는 것과 다른 것이 있습니까? –

+0

@ user1626342 흠, 매우 이상한데, evp가 더 이상 사용되지 않아서는 안된다. 코드/경고를 게시 할 수 있습니까? – Ha11owed

+0

Mac OS를 사용하고 있었기 때문에 헤더를 추가해야했습니다. –

0

은 서명 숯불에게

+0

이것은 올바르지 않습니다. 값이 10보다 작 으면 0으로 시작하는 부호없는 min-two-diget int로 인쇄 할 해시의 배열 주소를 전송합니다 (거의 확신합니다). 이 코드와 OP 코드의 유일한 차이점은 주소를 16 진수가 아닌 부호없는 int로 인쇄한다는 것입니다. 어느 쪽도 정확하지 않습니다. – WhozCraig

1

당신은 전체 버퍼를 덤프 할 수없는 방법을 인쇄하여 경고를 제거합니다. 아래처럼 루프 할 필요가 있습니다. 출력을 위해 얻는 값은 실제로 주소 인hash 버퍼이며, 이는 분명히 사용자가 원하는 값이 아닙니다. 당신은 버퍼의 진수 바이트 텍스트로 덤프합니다

그래서 ... 당신의 경고에 관한

int main() 
{ 
    const unsigned char data[] = "Hello, World"; 
    unsigned long length = sizeof(data); 
    unsigned char hash[SHA_DIGEST_LENGTH]; 
    SHA1(data, length, hash); 

    int i=0; 
    for (;i< sizeof(hash)/sizeof(hash[0]);++i) 
     printf("%02x \n", hash[i]); 

    return 0; 

} 

의 중단이 인터페이스를 사용하고있는 암호 조합을 수행하기위한 아웃 일자되기 때문에 시도 중 (SHA1). OpenSSL에는 최신 인터페이스가 추가되었습니다. 특히 EVP 인터페이스를 고려하십시오.