Getting hash of a binary file C

青春壹個敷衍的年華 提交于 2019-12-02 05:05:00

Thanks to everyone's comments I solved the problem. I am posting the code here, so others might find it beneficial.

void getFileHash(char *fileName){

unsigned char result[2*SHA_DIGEST_LENGTH];
unsigned char hash[SHA_DIGEST_LENGTH];
int i;
FILE *f = fopen(fileName,"rb");
SHA_CTX mdContent;
int bytes;
unsigned char data[1024];

if(f == NULL){
    printf("%s couldn't open file\n",fileName);
    exit(1);
}

SHA1_Init(&mdContent);
while((bytes = fread(data, 1, 1024, f)) != 0){

    SHA1_Update(&mdContent, data, bytes);
}

SHA1_Final(hash,&mdContent);

for(i=0;i<SHA_DIGEST_LENGTH;i++){
    printf("%02x",hash[i]);
}
printf("\n");
/** if you want to see the plain text of the hash */
for(i=0; i < SHA_DIGEST_LENGTH;i++){
    sprintf((char *)&(result[i*2]), "%02x",hash[i]);
}

printf("%s\n",result);

fclose(f);
}

I don't know how your SHA1() function works (is it from libssl?), but I assume that by

SHA1((unsigned char *)fileName, strlen(fileName),hash);

you are hashing file name, so /bin/ls string. You need to read file content byte by byte into a buffer and hash it.

You need to read the file chunk by chunk, and compute the digest chunk by chunk.

Read chunks up to e.g. 2048 bytes with fread. Use SHA1_Init in the beginning, SHA1_Update for each chunk, and SHA1_Final in the end.

You can use plain SHA1 function if you read the entire file in one gulp, but this is not recommended.

Another method is to memory-map the file (see mmap() or whatever the Windows equivalent is) and use plain SHA1. This method is very efficient but less portable than the other one.

You need just give argument of file context to SHA1(). The variable fileName contains string "/bin/ls" and SHA1() function returns hash of that string. Here is simple example how to read file and get hash

   /* Used variables */
   FILE *fp;
   char string[2048];
   unsigned char hash[SHA_DIGEST_LENGTH];
   int t;

   /* Open file */
   fp=fopen("test","r");
   if (fp == NULL)
   {
      printf("Can not open file\n");
      exit(1);
   }

   /* Read file */
   fread (string,1,sizeof(string),fp);

   /* Get hash of file */
   SHA1((unsigned char *)string, strlen(string),hash);

I hope buffer size of string (2048) will be enough for the file context.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!