【问题标题】:Qt Cryptographic HashingQt 加密哈希
【发布时间】:2013-03-05 19:53:20
【问题描述】:

我一直在尝试使用 Qt 加密库并且遇到了问题。 Qt (QCryptographicHash) 附带的那些运行良好,但仅支持 像 md5 和 SHA1 这样不安全的哈希方案,例如没有 SHA256。

我发现 Qt Cryptographic Architecture (QCA) 具有更多功能。 我从 Delta XMPP 项目站点获得了这些库。 http://delta.affinix.com/qca/

QCA 库的链接是http://delta.affinix.com/download/qca/2.0/qca-2.0.3.tar.bz2

这是 QCA 库的最新版本。

说明如下。

安装 QCA

QCA 需要 Qt 4.2 或更高版本。

对于 Windows:

配置
nmake(或制作)
安装win

使用最新的 Qt 一切。除了这个库之外,Qt 中的一切都很好。 我使用 Windows XP。 我按照安装说明进行操作,没有出现任何错误。

问题是当我尝试使用任何与 QCA 库有关的代码时会出错。我非常感谢任何帮助让这个库工作。

这是我的代码。

项目文件。

#-------------------------------------------------
#
# Project created by QtCreator 2011-11-14T14:23:21
#
#-------------------------------------------------

QT       += core
QT       -= gui

TARGET = kde_crypto2
CONFIG   += console
CONFIG   -= app_bundle
CONFIG   += crypto

TEMPLATE = app

SOURCES += main.cpp

源文件。

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QString>
#include <QtCrypto/QtCrypto>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTextStream t(stdout);

    if(!QCA::isSupported("sha1"))
        t << "SHA1 not supported!\n";
    else
    {
        QByteArray fillerString;
        fillerString.fill('a', 1000);

        QCA::Hash shaHash("sha1");
        for (int i=0; i<1000; i++)
            shaHash.update(fillerString);
        QByteArray hashResult = shaHash.final();
        if ( "34aa973cd4c4daa4f61eeb2bdbad27316534016f" == QCA::arrayToHex(hashResult) )
        {
            t << "big SHA1 is OK\n";
        }
        else
        {
            t << "big SHA1 failed\n";
        }
    }

    return a.exec();
}

错误码是

error: conversion from 'QCA::MemoryRegion' to non-scalar type 'QByteArray' requested

编辑(更新) 我在编译库时没有包含 --debug-and-release 标志。使用此标志重新编译库后,我在编译代码时不再出现错误。但是,当我运行我的代码时,只要到达使用 QCA 库的任何行,应用程序就会崩溃。因此,我认为库或安装方式有问题。

运行时的错误码是:

ASSERT: "global" in file qca_core.cpp, line 260 

【问题讨论】:

  • 我在 QCA 方面也遇到了问题,这似乎是一个无人维护的项目。我建议改为Botan。如果您使用它进行“合并构建”(阅读文档),它将生成一个头文件和一个包含整个库的源文件。如果你想对你的问题有有用的答案,你可能想指定你的确切错误,因为没有人能猜到它:)

标签: qt


【解决方案1】:

看起来错误的原因是您获得了带有shaHash.final()MemoryRegion,并且您尝试将其填充到QByteArray 中。尝试在final() 调用之后添加.toByteArray()。见http://delta.affinix.com/docs/qca/classQCA_1_1MemoryRegion.html

我不知道使用 QCA(及其维护状态)是否有意义。

【讨论】:

  • 我做了你建议的改变。这是我的新构建输出。 error: cannot find -lqcad error: collect2: ld returned 1 exit status
  • 使用 --debug-and-release 标志重新编译 QCA 库并添加您的建议后,错误如置顶帖所示。
  • 您是否查看过文档(delta.affinix.com/docs/qca/index.html,“使用 QCA”)?该库必须初始化才能使用,您可以为此使用 QCA::Initializer 对象。还要检查示例,例如delta.affinix.com/docs/qca/base64test_8cpp-example.html
  • 您对初始化的建议是关键!
【解决方案2】:

如果你是从源代码编译Qt,你可以试试这个merge request

集成 Aaron Gifford BSD 许可 SHA-256、SHA-384 和 SHA-512 已经完成了与原始 SHA-1 和 MD-5 类似的功能。

我自己没有尝试过,但是代码看起来还可以,而且从 cmets 中我可以看出它将包含在以后的版本中。

【讨论】:

  • 很遗憾我没有从源代码编译 Qt,但感谢您的建议。
【解决方案3】:

以下将消除错误。

QByteArray hashResult = hash.final().toByteArray();

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2017-03-01
    • 2011-12-03
    • 2016-10-29
    • 2011-12-06
    • 2013-07-12
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多