#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;
}
Я не проверял, запустив это, так что могут быть и другие ошибки.