Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2018, 01:26   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
Печаль Ошибка компиляции хэш-функции SHA1 OpenSSL

Добрый день. Пытаюсь сделать задание: преобразование строки с использованием хеш-функции SHA1. На входе программы файл со списком строк, с помощью хеш-функции преобразуем все строки. Затем на вход подаем искомую строку, также с помощью хеш-функции преобразовываем ее и ищем в общем списке преобразованных строк.
Версия OpenSSL 1.1.1-pre5 (beta) 17 Apr 2018
При компиляции вылазит такая ошибка
Цитата:
gcc sha1.c -o sha1 -lssl -lcrypto
/tmp/cc6cXY1P.o: In function `main':
sha1.c.text+0x415): undefined reference to `EVP_MD_CTX_free'
/tmp/cc6cXY1P.o: In function `init_evp':
sha1.c.text+0x4d9): undefined reference to `EVP_MD_CTX_new'
collect2: error: ld returned 1 exit status
Что может быть и нормальный ли алгоритм или как-то проще можно?
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/sha.h>
#include <stdbool.h>
 
//#ifndef EVP_MD_CTX_new
//# define EVP_MD_CTX_create()     EVP_MD_CTX_new()
//#endif
 
//#ifndef EVP_MD_CTX_free
//# define EVP_MD_CTX_destroy(ctx) EVP_MD_CTX_free((ctx))
//#endif
 
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
static void atexit_ssl_cleanup(void);
#endif
 
 
 
typedef struct 
{
    char* string;
    unsigned char md[EVP_MAX_MD_SIZE];
    int md_len;
} hash;
 
EVP_MD_CTX* mdctx;
const EVP_MD* md;
 
void init_evp();
void count_hash(hash* src);
bool md_compare(hash pair1, hash pair2);
 
int main(int argc, char const *argv[])
{
    if (argc < 2)
    {
        printf("Error\n");
        exit(1);
    }
    FILE* file = fopen(argv[1], "r");
    char buf[1024];
    init_evp();
    hash* hashes = malloc(sizeof(hash));
    int count = 0;
    while (fgets(buf, 1024, file)) {
        hashes = realloc(hashes, (count+1) * sizeof(hash));
        hashes[count].string = malloc((strlen(buf) + 1) * sizeof(char));
        strcpy(hashes[count].string, buf);
        count_hash(&hashes[count]);
        for (int j = 0; j < hashes[count].md_len; j++)
            printf("%02x", hashes[count].md[j]);
        printf("\n");
        count++;
    }
    fclose(file);
    hash findhash;
    file = fopen(argv[2], "r");
    if (!fgets(buf, 1024, file)) {
        printf("Error in findstr\n");
    }
    findhash.string = malloc((strlen(buf) + 1) * sizeof(char));
    strcpy(findhash.string, buf);
    fclose(file);
    count_hash(&findhash);
    printf("String to found:\n%s", findhash.string);
    printf("Digest is: ");
    for (int j = 0; j < findhash.md_len; j++)
        printf("%02x", findhash.md[j]);
    printf("\n");
    bool found = false;
    for (int i = 0; i < count; ++i)
    {
        if (md_compare(findhash, hashes[i]))
        {
            printf("String found. Index - %d\n", i+1);
            found = true;
            break;
        }
    }
    if (!found)
    {
        printf("String not found\n");
    }
    EVP_MD_CTX_free(mdctx);
    for (int i = 0; i < count; ++i)
    {
        free(hashes[i].string);
    }
    free(findhash.string);
    free(hashes);
    return 0;
}
 
void init_evp() {
    md = EVP_get_digestbyname("sha1");
    if (!md)
    {
        exit(1);
    }
    mdctx = EVP_MD_CTX_new();
}
 
void count_hash(hash* src) {
    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, src->string, strlen(src->string));
    EVP_DigestFinal_ex(mdctx, src->md, &src->md_len);
}
 
bool md_compare(hash hash1, hash hash2) {
    if (hash1.md_len != hash2.md_len)
    {
        return false;
    }
    for (int i = 0; i < hash1.md_len; ++i)
    {
        if (hash1.md[i] != hash2.md[i])
        {
            return false;
        }
    }
    return true;
}
Alexis_777 вне форума Ответить с цитированием
Старый 30.04.2018, 02:17   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 30.04.2018, 13:21   #3
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Это я комментил, с ними или без такая же ошибка
Alexis_777 вне форума Ответить с цитированием
Старый 30.04.2018, 13:28   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Alexis_777 Посмотреть сообщение
Это я комментил, с ними или без такая же ошибка
Да неужели?
Поиск рулит жэ. Ищи эти макросы в h-файлах.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 30.04.2018 в 13:30.
min@y™ вне форума Ответить с цитированием
Старый 30.04.2018, 14:28   #5
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Всё скомпилировал)) #include <openssl/evp.h> не то что нужно было подключить)

Последний раз редактировалось Alexis_777; 30.04.2018 в 14:31.
Alexis_777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SHA1 хеш rpy3uH Безопасность, Шифрование 3 24.05.2011 20:17
С. Задание с шаблоном функции. Ошибка на этапе компиляции. CofeIn Помощь студентам 2 18.02.2011 21:33
хэш функции non_bot Помощь студентам 2 06.01.2011 18:43
Ошибка при компиляции функции _alis_ Компоненты Delphi 2 18.05.2010 14:26
хэш-функции willhunting Фриланс 7 14.05.2010 12:47