【问题标题】:Using Botan C++ in QT to encrypt filesQT中使用Botan C++加密文件
【发布时间】:2018-12-13 08:19:51
【问题描述】:

我在 Windows 10 上使用 Qt Creator 4.6.1
基于 Qt 5.10.1 (MSVC 2015, 32 bit)
基于 May 2 2018 04:24:33
qmakemingw491_32

网上有一个项目使用botanwrapper 和包含Botan.pri

完整的代码很长,因此无法在此处发布,但可以在http://www.voidrealms.com/index.php?r=source/view&id=1 以 zip 文件的形式获得。

一切正常并加密文件,但是当我将文件带入我的项目时,我会遇到大量编译错误,如下所示。

botan.h:9380: error: expected identifier before '(' token
          X942_DH_PARAMETERS = ANSI_X9_42,
          ^

error: expected '}' before '(' token which points to the line

enum Format {
         ANSI_X9_42,
         ANSI_X9_57,
         PKCS_3,

         DSA_PARAMETERS = ANSI_X9_57,
         DH_PARAMETERS = ANSI_X9_42,
         X942_DH_PARAMETERS = ANSI_X9_42, // Error points to here
         PKCS3_DH_PARAMETERS = PKCS_3
      };

还有很多与const相关的错误,例如

error: non-member function 'bool Botan::verify_group(Botan::RandomNumberGenerator&, bool)' cannot have cv-qualifier

bool verify_group(RandomNumberGenerator& rng, bool strong) const;  

指向下面的代码


bool verify_group(RandomNumberGenerator& rng, bool strong) const;

我已经检查了 .pro 文件的包含内容,并且我的文件设置与在相同设置上编译和运行的项目相同。我有相同的botan.pri 文件,其中包含

win32 {
    DEFINES += BOTAN_TARGET_OS_IS_WINDOWS \
        BOTAN_TARGET_OS_HAS_LOADLIBRARY BOTAN_TARGET_OS_HAS_WIN32_GET_SYSTEMTIME \
        BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK BOTAN_HAS_DYNAMICALLY_LOADED_ENGINE \
        BOTAN_HAS_DYNAMIC_LOADER BOTAN_HAS_ENTROPY_SRC_CAPI BOTAN_HAS_ENTROPY_SRC_WIN32 \
        BOTAN_HAS_MUTEX_WIN32

    win32-msvc* {
        QMAKE_CXXFLAGS += -wd4251 -wd4290 -wd4250
        DEFINES += BOTAN_BUILD_COMPILER_IS_MSVC BOTAN_TARGET_OS_HAS_GMTIME_S
    } else {
        QMAKE_CFLAGS += -fpermissive -finline-functions -Wno-long-long
        QMAKE_CXXFLAGS += -fpermissive -finline-functions -Wno-long-long
    }
    LIBS += -ladvapi32 -luser32
}

我读过删除 const 将删除 1 个或多个错误,但我不明白为什么在愉快地编译 botan.h 并运行构建和加密文件的同一设置中这会被破坏。有人可以帮助如何开始解决这个问题。帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: c++ qt encryption botan


    【解决方案1】:

    问题是 Windows API 定义了一个宏 X942_DH_PARAMETERS 与此枚举冲突。 (事实上​​,枚举在后来的 Botan 版本中被重命名,以避免这个问题https://github.com/randombit/botan/issues/482)。

    您可以在包含 Botan 标头之前使用 #undef X942_DH_PARAMETERS 来解决此问题。

    【讨论】:

    • Jack 非常感谢,我对此感到厌烦。现在我有一个奇怪的error: undefined reference to BotanWrapper::DecryptFileW(QString, QString)` 全局搜索甚至在整个 QT 项目的任何地方都没有显示?无论如何 - 再次感谢!
    • 对不起,我对 Qt 包装器一无所知,但要注意的是DecryptFileW 是一个 Windows API,Windows 标头可能正在做类似#define DecryptFile DecryptFileW 的事情,所以@ 987654327@ 可以。
    • 再次感谢杰克。我在 Qt 论坛上问过,但没有回复,所以我在这里回复了您的解决方案。我刚刚将它跟踪到 winbase.h 中的 DecryptFile 定义,所以我将 botanwrapper 重命名为 DecryptFileW 并且有效。我不知道原来的 FileW 后缀是从哪里来的,尽管老实说我已经迷失了方向。我需要考虑哪种是取消定义或保持原样的最佳方式,并在 github 上发布冲突错误以进行包装。希望我能在这里奖励喜欢/明星/学分,我会按照你的方式扔一个包。