2016-05-05 48 views
0

我需要從文件內容生成SHA-1代碼(例如,具有不同名稱的相同圖像會生成相同的代碼)。我寧願使用openssl,因爲it seems to be the more performant從文件內容生成sha-1

this問題是解釋如何從文件內容獲取SHA-1,但它不保證爲某些文件工作。

有這個問題的任何解決方案(甚至使用其他庫比openssl,但性能真的很重要)。

+0

http://stackoverflow.com/questions/3467097/correctly-getting-sha-1-for-files-using-openssl – Lacobus

+0

我已經鏈接了這個問題:它沒有提供解決方案。 – justHelloWorld

回答

1

該實施例說明如何生成SHA1從文件消化和用openssl在其十六進制表示其顯示:

#include <stdio.h> 
#include <openssl/sha.h> 

#define MAX_BUF_LEN (1024 * 8) 

int sha1(const char * name, unsigned char * out) 
{ 
    FILE * pf; 
    unsigned char buf[ MAX_BUF_LEN ]; 
    SHA_CTX ctxt; 

    pf = fopen(name, "rb"); 

    if(!pf) 
     return -1; 

    SHA1_Init(&ctxt); 

    while(1) 
    { 
     size_t len; 

     len = fread(buf, 1, MAX_BUF_LEN, pf); 

     if(len <= 0) 
      break; 

     SHA1_Update(&ctxt, buf, len); 
    } 

    fclose(pf); 

    SHA1_Final(out, &ctxt); 

    return 0; 
} 


void bin2hex(unsigned char * src, int len, char * hex) 
{ 
    int i, j; 

    for(i = 0, j = 0; i < len; i++, j+=2) 
     sprintf(&hex[j], "%02x", src[i]); 
} 


int main(int argc, char * argv[]) 
{ 
    unsigned char digest[ SHA_DIGEST_LENGTH ]; 
    char str[ (SHA_DIGEST_LENGTH * 2) + 1 ]; 

    if(sha1(argv[1], digest)) 
    { 
     printf("Error!\n"); 
     return 1; 
    } 

    bin2hex(digest, sizeof(digest), str); 

    printf("SHA1: %s\n", str); 

    return 0; 
} 

/* eof */ 

編譯:

$ gcc sha1.c -lcrypto -o sha1 

測試:

$ cat file.txt 
The quick brown fox jumps over the lazy dog 

$ ./sha1 file.txt 
SHA1: be417768b5c3c5c1d9bcb2e7c119196dd76b5570 

$ sha1sum file.txt 
be417768b5c3c5c1d9bcb2e7c119196dd76b5570 file.txt 

Voilá!沒有神祕!