gpt4 book ai didi

c - 用C语言为文本文件构建Merkle树,每次重复该过程,都会生成一个新的根哈希

转载 作者:行者123 更新时间:2023-11-30 16:19:22 28 4
gpt4 key购买 nike

因此,我尝试通过首先计算 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,以前也犯过一些琐碎的内存错误,我想这也一定是简单的事情,只是似乎无法破解它。

任何和所有的帮助将不胜感激,谢谢!

最佳答案

问题是:

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

关于c - 用C语言为文本文件构建Merkle树,每次重复该过程,都会生成一个新的根哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55637566/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com