2016-05-05 47 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á!没有神秘!