c - 在C中为文本文件构建Merkle树,每次重复该过程,都会生成一个新的根哈希
问题描述
因此,我试图通过首先计算 64 字节行的 SHA1 哈希,将它们连接起来并再次找到连接哈希的哈希来识别文本文件的根哈希。我的整个过程是这样的,
以 64 字节行读取文件 > 散列每一行并写入文件 [hashes.txt] > 一次连接两个散列并写入另一个文件 [temp_hashes.txt] > 散列临时的连接散列并写回[哈希.txt]。
我重复这个过程,直到 [hashes.txt] 的长度为 1。最后,我将其写入我的永久记录 [secure.txt]。
我正在使用图书馆。我使用了两个文本文件进行测试,我们称它们为 [one.txt] 和 [two.txt]。两者都有一些来自 lorem ipsum 的摘录。现在一切似乎都很好,直到第一个 64 字节行散列步骤,但只要我将它组合起来,每次运行代码时根散列都会变得唯一。我尝试清空 [hashes.txt] 和 [temp_hashes.txt] 并重新运行。
这是我的第一个哈希步骤。
char buf[64];
unsigned char all_hashes[TABLE_SIZE][21];
unsigned char md[SHA_DIGEST_LENGTH];
while (fgets(buf, sizeof(buf), fptr) != NULL){
get_sha1_hash(buf, sizeof(buf), md);
for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
fprintf(outfile, "%02x", md[i]);
fprintf(outfile, "\n");
}
组合是这样的
char * temp = malloc(sizeof(char)*100);
char * line = malloc(sizeof(char)*100);
int k = 0;
while (fgets(line, 100, file) != NULL) {
line[strlen(line)-1] = '\0';
if (k%2 == 0) {
fprintf(outfile, "%s", line);
}
else {
fprintf(outfile, "%s\n", line);
}
k++;
}
这是重新哈希步骤
char line[1024]; // I guess the same as char line[100]
int i = 0;
unsigned char md[SHA_DIGEST_LENGTH];
while(fgets(line, sizeof(line), infile) != NULL) {
get_sha1_hash(line, sizeof(line), md);
for(int i = 0; i<SHA_DIGEST_LENGTH; i++)
fprintf(outfile, "%02x", md[i]);
fprintf(outfile, "%s", "\n");
}
最后,一切都像这样在一起
while(calculate_length_of_file("hashes.txt") > 1) {
combine_hashes_by_two();
hash_file_line_by_line();
}
我刚刚开始使用C并且以前犯过一些微不足道的记忆错误,我认为这里也一定很简单,只是似乎无法破解它。
任何和所有的帮助将不胜感激,谢谢!
解决方案
问题是:
在这里,您将一行读入缓冲区buf[64]
:
while (fgets(buf, sizeof(buf), fptr) != NULL){
在这里,您散列完整的缓冲区:
get_sha1_hash(buf, sizeof(buf), md);
但fgets()
可能没有读入整个缓冲区;它只读取到下一个换行符!
所以,可能你的意思是散列:
get_sha1_hash(buf, strlen(buf), md);
否则,您还会在 末尾散列一些未初始化的内容buf
,这会导致(伪)随机结果。
推荐阅读
- node.js - RangeError [ERR_SOCKET_BAD_PORT]:端口应 >= 0 且 < 65536。收到 NaN
- r - 如何与 R 执行双对交配。请修复一些代码问题
- mysql - 如何将 XAMPP 与 Intellij 连接(社区版)
- c# - 加速/减速朝向移动的目标并击中它
- python - 如何等待 Python subprocess.check_output() 完成?
- android - MotionScene 中的 OnSwipe 过渡,应用于 ScrollView 不起作用
- postgresql - 通过反向代理连接到 pgadmin 客户端
- javascript - onMessage 的问题
- docker - 通过 Virtualbox 将本地主机从 ubuntu 寻址到 Windows 8
- c# - PowerShell 版本 4 或版本 5 程序集的引用路径