Хеш Sha512 в QT через OpenSSL

Я пытаюсь использовать функцию Sha512 в openSSL, но не могу заставить ее работать, так как я получаю ошибки компилятора только при запуске кода. Я включаю #include <openssl/sha.h> в начало файла .cpp, а затем в действие события кнопки я помещаю только следующий код ниже.

SHA512_CTX ctx;
SHA512_Init(&ctx);

//Will uncomment below in later if I get SHA512_Init to work

//SHA512_Update(&ctx, string, strlen(string));
//SHA512_Final(digest, &ctx);

Я получаю сообщение об ошибке компоновщика, сообщающее мои неопределенные символы для архитектуры x86_64, подразумевая, что функция не существует?

Я знаю, что QT 5 имеет хэш-функцию, но я ограничен QT 4.8, поэтому я не могу использовать криптографическую хеш-функцию sha512, доступную в структуре QT 5+.

Любая помощь приветствуется!

Использовал macports для установки openssl

Я использую Mac OS 10.9.2

СОЗДАТЬ ФАЙЛ

#-------------------------------------------------
#
# Project created by QtCreator 2014-06-11T20:27:49
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ExchangeTab
TEMPLATE = app

LIBS += -L/usr/include/openssl -openssl
INCLUDEPATH += /usr/include/openssl

SOURCES += main.cpp\
        mainwindow.cpp \
    httpsocket.cpp \
    cloaksend.cpp \
    exchange.cpp

HEADERS  += mainwindow.h \
    httpsocket.h \
    cloaksend.h \
    exchange.h

FORMS    += mainwindow.ui

RESOURCES += \
    AppResources.qrc

Ищите кроссплатформенное решение.


person Joseph Astrahan    schedule 17.06.2014    source источник
comment
Ошибка компоновщика означает, что вы не подключаетесь к нужной библиотеке. Пожалуйста, укажите свой make- / cmake-файл в своем вопросе. Также укажите, на какой ОС вы работаете.   -  person Unapiedra    schedule 17.06.2014
comment
Mac OS 10.9.2, через секунду я добавлю и make-файл.   -  person Joseph Astrahan    schedule 17.06.2014
comment
Сделайте файл доступным по запросу. Спасибо, что посмотрели!   -  person Joseph Astrahan    schedule 17.06.2014
comment
после некоторого исследования я думаю, что моя проблема может заключаться в том, что я не использую LIBS или INCLUDEPATH в файле makefile, не знаю, как это сделать для openSSL или где он устанавливает openSSL. Я использовал macports для установки новейшего openSSL   -  person Joseph Astrahan    schedule 17.06.2014


Ответы (3)


Вам нужно установить ссылку на нужную библиотеку (openSSL)

Посмотрите здесь: Как включить OpenSSL в проект Qt

В частности, добавьте это в свой .pro файл .:

LIBS += -L/opt/local/lib/ -lcrypto

Для включения файлов .h добавьте эту строку в ваш файл .pro:

INCLUDEPATH += /opt/local/include

[1] говорит, что путь включения по умолчанию будет быть /opt/local/include/.

person Unapiedra    schedule 17.06.2014
comment
Я на самом деле просто искал там, но я не уверен, какой путь включения для Mac, есть идеи? Я отредактировал свой make-файл, чтобы показать, какой я думаю путь, но все еще не работает, та же ошибка компоновщика. Вы определенно на правильном пути. - person Joseph Astrahan; 17.06.2014
comment
Он должен быть рядом с /opt/local/include. И путь к библиотеке будет /usr/local/lib Это должно быть сказано при установке с помощью macports. - person Unapiedra; 17.06.2014
comment
все еще не работает, вот что я пробовал LIBS + = -L / opt / local / include / -openssl INCLUDEPATH + = / opt / local / include / Я читал где-то еще, что, чтобы сделать эту кроссплатформенную дружественную, мне, возможно, придется использовать что-то называется OPENSSL_LIB_PATH, знаете, что это такое? Я также пробовал использовать часть libs, перейдя в / usr / local / lib, даже перешел в терминал, чтобы увидеть, действительно ли существуют файлы, openssl действительно существует там, как ни странно, без .h (ну, просто понял, что это был каталог дополнительных файлов .h). - person Joseph Astrahan; 17.06.2014

LIBS += -L/usr/include/openssl -openssl
INCLUDEPATH += /usr/include/openssl

Это выглядит некорректно. Библиотеки OpenSSL: libcrypto (-lcrypto) и libssl (-lssl). There is nolibopenssl(-lopenssl). Пытаться:

LIBS += -L/usr/lib -lcrypto
INCLUDEPATH += /usr/include/openssl

Но библиотеки версии 0.9.8. Вы можете рассмотреть возможность обновления до 1.0.1h.

$ ls /usr/lib | grep crypto
libcrypto.0.9.7.dylib
libcrypto.0.9.8.dylib
libcrypto.dylib
libk5crypto.dylib

И

$ /usr/bin/openssl version
OpenSSL 0.9.8y 5 Feb 2013

Если вы выберете обновление, OpenSSL будет установлен в /usr/local/ssl. Избегайте смешивания / сопоставления версии OpenSSL со следующими.

INCLUDEPATH += /usr/local/ssl/include/openssl
LIBS += /usr/local/ssl/lib/libcrypto.a

Можно указать объекты и архивы в LIBS. См. Как добавить объектные файлы в проект в Qt < / а>.

person jww    schedule 17.06.2014
comment
Спасибо. Похоже, что опция -lcrypto в вашем сообщении оказалась ключом к найденному мной решению. Мне любопытно, могли бы вы объяснить, почему мое решение сработало? - person Joseph Astrahan; 17.06.2014

Хорошо, возможно, я ответил на свой вопрос, но мне понадобится помощь, чтобы понять, почему это сработало.

Мой make-файл действительно был проблемой. Я добавил следующие 3 строки.

INCLUDEPATH += $$OPENSSL_INCLUDE_PATH
LIBS += $$join(OPENSSL_LIB_PATH,,-L,)
LIBS += -lcrypto

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

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

LIBS += -lcrypto

Это также просто «работало» без ошибок компоновщика. Похоже, это единственная команда, которая мне нужна. Вопрос в том ... будет ли это кроссплатформенным, если я возьму этот код и скомпилирую его на Linux или Windows? Я не уверен, но это сработало.

person Joseph Astrahan    schedule 17.06.2014
comment
Да, он должен быть кроссплатформенным. Однако вам нужен способ автоматического поиска пути к библиотеке. - person Unapiedra; 17.06.2014
comment
Я не уверен, что выбрать правильный ответ в этом случае, но у меня был еще один вопрос, с которым вы тоже могли бы помочь. Он расположен по адресу (stackoverflow.com/questions/24266505/). У меня работает SHA, я просто пытаюсь заставить его работать с HMAC. Думаю, я почти разобрался, может ты поможешь мне с тем, что я сделал не так? Большое спасибо за все советы! Это действительно помогло! - person Joseph Astrahan; 18.06.2014