При построении дерева Merkle для текстового файла в C каждый раз, когда процесс повторяется, генерируется новый корневой хеш - PullRequest
0 голосов
/ 11 апреля 2019

Итак, я пытаюсь определить корневой хэш для текстового файла, сначала вычислив хэши 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 и раньше допускал тривиальные ошибки памяти, я думаю, что и здесь должно быть что-то простое, просто не могу его взломать.

Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 11 апреля 2019

Проблема:

Здесь вы читаете строку в буфер buf[64]:

while (fgets(buf, sizeof(buf), fptr) != NULL){

Здесь вы хешируете буфер complete :

    get_sha1_hash(buf, sizeof(buf), md);

но fgets() может не прочитать весь буфер в; он читает только до следующего перевода строки!

Итак, возможно, вы хотели хешировать:

    get_sha1_hash(buf, strlen(buf), md);

В противном случае вы также хешируете неинициализированный контент в конце buf, что приводит к (псевдо) случайным результатам.

...