【发布时间】:2013-04-03 09:14:36
【问题描述】:
我有一个文件
testfile和一个字符串teststring。我在 shell 中写道:
echo "a" > testfile-
然后
xxd testfile
所以我可以看到我的文件内容的十六进制值
输出:0000000: 610a a. -
查看我的代码:
int file; struct stat s; unsigned long size; char* buffer; char md5[MD5_DIGEST_LENGTH] file = open("testfile", O_RDONLY); if (file < 0) return false; if (fstat(file, &s) < 0) { close(file); return false; } size = s.st_size; //GET FILE SIZE printf("filesize: %lu\n", size); //PRINT FILESIZE FOR DEBUGGING buffer = (char*)mmap(0, size, PROT_READ, MAP_SHARED, file, 0); //MAP FILE CONTENT TO BUFFER MD5((unsigned char*)buffer, size, md5); //GENERATE MD5 munmap(buffer, size); //UNMAP BUFFER close(file); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", md5[i]); printf("\n"); unsigned char* teststring = "\x61\x0a"; //SAME STRING AS IN THE FILE MD5((unsigned char*)teststring, 2, md5); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", md5[i]); printf("\n"); -
打印出来:
filesize: 2 60b725f10c9c85c70d97880dfe8191b3 e29311f6f1bf1af907f9ef9f44b8328b两个完全不同的 md5哈希。
我尝试将buffer写入文件
并将teststring写入文件它们是相同的!
为什么?buffer和teststring不一样吗?
【问题讨论】:
-
以十六进制打印缓冲区/字符串(不是 md5s),看看它们是否不同。如果它们相同,您可能需要以不同的方式使用 md5 函数(某些实现需要您完成 md5 操作)
-
如果把这两种方法的顺序颠倒一下,结果是一样的吗? (即 MD5 接口可能会继续更新校验和?)
-
只需执行
printf("%02x", buffer[0]);printf("%02x", buffer[1]);和printf("%02x", teststring[0]);printf("%02x", teststring[1]);。那么你实际上知道它们是否相同(我认为它们不是)。查看文档我认为您正确使用了 md5 功能 -
您是否尝试在调用之前和调用之间清除
md5数组? -
@x4rf41 投票!没错,字符串是
0x64 0x0a,文件是0x61 0x0a,但为什么呢?如您所见,我输入了``teststring = "\x61\x0a"