所以我一直在玩SHA哈希,但是我遇到了一些障碍。出于某种原因,命令行中的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)。造成这种情况的原因是什么?
答案 0 :(得分:3)
问题是命令行函数“shasum”将文件名作为参数,而openssl-library 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函数。