Intereting Posts
реализовать список операций чтения в debugfs Почему мой компьютер не показывает ускорение при использовании параллельного кода? Требуется ли мьютекс для синхронизации простого флага между pthreads? чтение строк с использованием fscanf C – функция, возвращающая массив C и Go, связанная с C.free () Как динамически получить текущее имя целевого файла компилятора в LOCAL_CFLAGS Android.mk? Получить результат другого процесса с использованием системной функции без использования файлов Как открыть файл C с относительным путем? Предупреждение в C: назначение делает целое число из указателя без литья Как узнать, какая функция называется другой Как использовать указатели для возврата функций 2D-массивов? Что делает ** на языке C Обнаружение количества ядер процессора с использованием streamов strstr () для строки, которая не имеет нулевой последовательности

Вычислить и распечатать hash SHA256 файла с помощью OpenSSL

Я пытаюсь написать функцию C, используя OpenSSL / libcrypto, чтобы вычислить сумму SHA256 файла. Я основываю свой код на примере C ++ Адама Ламера.

Вот мой код:

int main (int argc, char** argv) { char calc_hash[65]; calc_sha256("file.txt", calc_hash); } int calc_sha256 (char* path, char output[65]) { FILE* file = fopen(path, "rb"); if(!file) return -1; char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); const int bufSize = 32768; char* buffer = malloc(bufSize); int bytesRead = 0; if(!buffer) return -1; while((bytesRead = fread(buffer, 1, bufSize, file))) { SHA256_Update(&sha256, buffer, bytesRead); } SHA256_Final(hash, &sha256); sha256_hash_string(hash, output); fclose(file); free(buffer); return 0; } void sha256_hash_string (char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]) { int i = 0; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(outputBuffer + (i * 2), "%02x", hash[i]); } outputBuffer[64] = 0; } 

Проблема в том, что … взгляните на рассчитанные суммы ниже для файла примера:

 Known good SHA256: 6da032d0f859191f3ec46a89860694c61e65460d54f2f6760b033fa416b73866 Calc. by my code: 6dff32ffff59191f3eff6affff06ffff1e65460d54ffff760b033fff16ff3866 

Я также обнаруживаю * обнаружение разбития стека * при завершении выполнения кода.

Кто-нибудь видит, что я делаю неправильно?

Спасибо!

Похоже, в вашем выводе есть много блоков «0xff», а соответствующие блоки в хорошей строке имеют высокий бит … может быть проблема с расширением знака где-то.

Делает ли:

 char hash[SHA256_DIGEST_LENGTH]; 

без знака, например:

 unsigned char hash[SHA256_DIGEST_LENGTH]; 

Помогите? (Особенно в подписи sha256_hash_string .)

Вы печатаете подписанный char как целое число. Если байт отрицательный, он преобразуется в signed int ( продвижение аргументов по умолчанию в вызове sprintf ), а затем преобразуется в unsigned int (через спецификатор формата %x ) и распечатывается.

Таким образом, байт A0 равен -96 в качестве подписанного байта, который преобразуется в -96 как signed int , который равен 0xFFFFFFA0 в шестнадцатеричном виде, поэтому он печатается как FFFFFFA0.

Чтобы исправить это, делайте каждый байт перед unsigned char перед печатью:

 sprintf(..., (unsigned char)hash[i]); 

Вы получаете предупреждение о разбитии стека, потому что есть подписанный байт около конца хеша, поэтому вы пишете 8 байтов FFFFFFB7 со смещением 58, когда вы намеревались писать только 2 байта. Это приводит к переполнению буфера , который обнаруживается здесь, потому что компилятор, вероятно, вставил защитную область или cookie безопасности в стек до возвращаемого значения и обнаружил, что эта защитная область была непреднамеренно изменена.