在C中为文本文件构建Merkle树,每次重复该过程时,都会生成新的根哈希

问题描述 投票:0回答:1

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

以64字节行读取文件>散列每行并写入文件[hashes.txt]>一次连接两个哈希并写入另一个文件[temp_hashes.txt]>哈希临时,连接哈希并写回[hashes.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并且之前犯过一些琐碎的记忆错误,我认为这里也一定很简单,似乎无法解决它。

非常感谢任何和所有的帮助,谢谢!

c file hash sha1
1个回答
0
投票

问题是:

在这里,你读取缓冲区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末尾散列一些未初始化的内容,从而导致(伪)随机结果。

© www.soinside.com 2019 - 2024. All rights reserved.