用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
末尾散列一些未初始化的内容,这会导致(伪)随机结果。
因此,我试图通过首先计算 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
末尾散列一些未初始化的内容,这会导致(伪)随机结果。