Правильное хэширование строки в C

#c #string #encryption #hash #openssl

Вопрос:

При использовании терминальной утилиты «openssl» со следующей командой:

 echo -n "Hello World!" | openssl sha1
 

Это и есть произведенная продукция:

(stdin)= 2ef7bde608ce5404e97d5f042f95f89f1c232871

Я попытался создать тот же вывод со следующим кодом на C:

 #include <stdio.h>
#include <stdlib.h>
#include <openssl/sha.h>

int main(void){
    const unsigned char source_string[1024] = "Hello World!";
    unsigned char dest_string[1024];
    SHA1(source_string, 16, dest_string);
    printf("String: %snHashed string: %sn", source_string, dest_string);
    return 0;
}
 

Тем не менее, он выдает этот странный вывод, отличный от юникода:

 String: Hello World!
Hashed string: #�V�#��@�����T�
 

Как я могу заставить его выдавать тот же вывод, что и ранее показанная команда терминала openssl?

Комментарии:

1. Данные, которые вы получаете в целевой «строке», на самом деле не являются строкой C, заканчивающейся нулем. Это последовательность необработанных байтов байтов фиксированной длины.

Ответ №1:

Вы должны

  • Передайте правильную длину строки (она имеет длину 12 байт) SHA1 .
  • Выведите результат в шестнадцатеричном формате, а не в виде строки.
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>

int main(void){
    const unsigned char source_string[1024] = "Hello World!";
    unsigned char dest_string[1024];
    int i;
    SHA1(source_string, strlen((const char*)source_string), dest_string);
    printf("String: %snHashed string: ", source_string);
    for (i = 0; i < 20; i  ) printf("x", dest_string[i]);
    putchar('n');
    return 0;
}
 

Я не проверял, запустив это, так что могут быть и другие ошибки.