Итак, я пытаюсь определить корневой хэш для текстового файла, сначала вычислив хэши SHA1 для 64-байтовых строк, объединяя их и снова находя хеш для сцепленного хэша. Мой общий процесс примерно такой,
Чтение файла в 64-байтовых строках> Хеширование каждой строки и запись в файл [hashes.txt]> Сцепление хэшей по два за раз и запись в другой файл [temp_hashes.txt]> Хеширование временных сцепленных хэшей и написать обратно в [hashes.txt].
Я повторяю этот процесс, пока длина [hashes.txt] не станет равной единице.
Наконец, я записываю это в свою постоянную запись [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 и раньше допускал тривиальные ошибки памяти, я думаю, что и здесь должно быть что-то простое, просто не могу его взломать.
Любая помощь будет принята с благодарностью, спасибо!