所以我一直在玩沙哈辛,但我碰到了一堵墙。出于某种原因,在我的程序中,来自命令行的shasum和来自openssl的SHA1()会产生两个不同的结果。
代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <openssl/sha.h>

int main(int argc, char* argv[]){
  int i;
  char data[] = "README";
  size_t length = sizeof(data);
  unsigned char hash[50];

  SHA1(data, length, hash);

  printf("shasum of \"README\" is \n");
  for(i = 0; i<SHA_DIGEST_LENGTH; i++){
    printf("%x", hash[i]);
  }
  printf("\n");

  /*Using shasum utility*/

  int rc = fork();
  if(rc < 0){
    fprintf(stderr, "Fork failed. \n");
    exit(1);
  }
  else if(rc == 0){
    char* myargs[3];
    myargs[0] = strdup("shasum");
    myargs[1] = strdup("README");
    myargs[2] = NULL;
    execvp(myargs[0], myargs);
  }
  wait(NULL);

  return 0;
}

输出:
shasum of "README" is
aabc5996b4a0256158cbaa6eb4e01b3aa992d942
827cc372e1a3c99b66f6ad820b223939c68bd389  README

第一个散列来自SHA1,第二个散列来自shasum(程序内的fork/exec)。这是什么原因?

最佳答案

问题是命令行函数“shasum”将文件名作为参数,而openssl库C函数“shasum”将实际数据作为参数。
也就是说,将名为README的文件的哈希结果与字符串“README”的哈希结果进行比较。
要查看两个计算结果相同,只需更改:

SHA1(data, length, hash);


SHA1(data, length-1, hash);

正如Jonathan Leffler所说,这是为了纠正这样一个事实,即您包含了终止符“\0”。
对于另一个计算,可以执行echo -n README | shasum来查看真正的散列。或者,要在程序中查看结果,只需将其输出到名为README:echo -n README > README的文件。
然后程序将输出:
shasum of "README" is
69e27356ef629022720d868ab0c0e3394775b6c1
69e27356ef629022720d868ab0c0e3394775b6c1  README

编辑:
如果要使用SHA1函数计算自述文件的哈希值,则必须读取该文件(请参见需要以编程方式将该文件读取到char*缓冲区(请参见Reading the whole text file into a char array in C)并将该缓冲区传递给SHA1函数。

关于c - 命令行中的SHA1()vs shasum,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26622185/

10-09 03:58