用C语言为一个文本文件构建一个Merkle树,每次重复这个过程,都会生成一个新的root hash

Building a Merkle tree for a text file in C, every time the process is repeated, a new root hash is generated

因此,我试图通过首先计算 64 字节行的 SHA1 哈希值、连接它们并再次找到连接后的哈希值来识别文本文件的根哈希值。我的整个过程是这样的,

以 64 字节行读取文件 > 散列每一行并写入文件[hashes.txt] > 一次连接两个散列并写入另一个文件[temp_hashes.txt] >散列临时的、串联的散列并写回 [hashes.txt].

我重复这个过程,直到 [hashes.txt] 的长度为一。 最后,我将此写到我的永久记录中 [secure.txt].

我正在使用图书馆。我使用了两个文本文件进行测试,我们称它们为 [one.txt] 和 [two.txt]。两者都有 lorem ipsum 的一些摘录。现在一切似乎都很好,直到第一个 64 字节行散列步骤,但只要我将它组合起来,每次我 运行 代码时根散列都会变得唯一。 我尝试清空 [hashes.txt] 和 [temp_hashes.txt] 并重新 运行ning.

这是我的第一个哈希步骤。

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] = '[=11=]';
    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 末尾散列一些未初始化的内容,这会导致(伪)随机结果。