在 Crypto++ 库中找不到 hkdf.h

Posted

技术标签:

【中文标题】在 Crypto++ 库中找不到 hkdf.h【英文标题】:hkdf.h not found in Crypto++ library 【发布时间】:2018-10-19 20:37:57 【问题描述】:

我无法将 crypto++ 库中的 hkdf.h 包含到我的代码中。

上面写着 cryptopp/hkdf.h not found。虽然我可以将同一个库中的其他部分导入到我的代码中,例如cryptopp/sha.h

我正在使用带有-std=c++11-lcryptopp 标志的g++

我查看了文档,它建议了我正在使用的 -lcryptopp 标志。这应该不是问题,我错过了什么吗?

编辑 1:

编译命令:

g++ -std=c++11 mycode.cpp -lcryptopp

编辑 2:

如何检查我的 crypto++ 库的版本? 下载命令为:

sudo apt-get install libcrypto++-dev

我的操作系统是 Ubuntu 16.04

【问题讨论】:

你确认cryptopp/hkdf.h真的存在了吗? 它应该在那里,根据文档但它不是,我通过官方 Ubuntu 存储库下载了该库,所以我从来没有想到该文件实际上可能已经丢失。我想我将不得不在外部下载和使用该库。 【参考方案1】:

编译命令:

g++ -std=c++11 mycode.cpp -lcryptopp

这并不能回答您的问题。这只是一个提醒......

小心g++ -std=c++11 mycode.cpp -lcryptopp。必须使用几乎相同的选项来构建库和您的程序。我不相信 Debian 使用-std=c++11,所以你不应该使用它。

“使用几乎相同的选项” 规则适用于所有发行版和所有 C++ 库;而不仅仅是 Debian 上的 Crypto++。如果你对 Fedora 上的 PCRE 库做同样的事情,你会遇到类似的问题。

您可以在Debian Package Auto-Building | Crypto++ 处查看 Debian 用于构建库的标志。 Debian 使用的标志是:

-DHAVE_CONFIG_H -I. -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 \
-fstack-protector-strong -Wformat -Werror=format-security \
-DCRYPTOPP_NO_UNALIGNED_DATA_ACCESS -DNDEBUG -fPIC -DPIC

出于您的目的,重要的标志是-g -O2 -DNDEBUG -fPIC。这些标志是您应该在程序中使用的标志。 -DCRYPTOPP_NO_UNALIGNED_DATA_ACCESS 应用在文件 config.h 中,因此您无需在命令行上传递它。 (未对齐的访问最近被移除了,因为它造成了太多的问题,所以你以后甚至不必担心-DCRYPTOPP_NO_UNALIGNED_DATA_ACCESS)。

如果你愿意,可以使用-std=c++11。但是,您必须自己从源代码下载和构建库,以确保库和您的程序使用相同的标志。

如果您自己构建库,请参阅 Crypto++ wiki 上的 GNUmakefile | Building the Library。

如果您自己构建库,那么请帮自己一个忙,删除发行版提供的库版本。像sudo apt-get remove --purge libcrypto++ libcrypto++-dev libcrypto++-dbg 这样的东西。否则你会在不经意间混合和匹配它们。

【讨论】:

【参考方案2】:

无法将 crypto++ 库中的 hkdf.h 包含到我的代码中。

它说没有找到cryptopp/hkdf.h。

HKDF 在 Crypto++ 5.6.3 中添加。旧版本的库没有它,就像 Ubuntu 14 或 CentOS 5 上提供的一样。

它是使用文件hkdf.h 的仅标头实现。您可以下载它并将其放在 Crypto++ 安装目录中。对于 Crypto++ 5.6.3,可能类似于以下内容:

# Crypto++ 5.6.3
wget https://raw.githubusercontent.com/weidai11/cryptopp/217cb1f983c6/hkdf.h
sudo cp hkdf.h /usr/include/cryptopp/

在 Crypto++ 7.0 中更改了密钥派生函数接口。更准确地说,在 Crypto++ 7.0 中,我们添加了一个基类用作接口(以前没有)。基类是KeyDerivationFunction,它允许我们改进密钥派生函数类的自测。因此,对于 Crypto++ 7.0,可能类似于以下内容:

# Crypto++ 7.0
wget https://raw.githubusercontent.com/weidai11/cryptopp/c8d8caf70074/hkdf.h
sudo cp hkdf.h /usr/include/cryptopp/

总结一下:

Crypto++ 5.6.3:您只需要提供 HKDF 的文件 Crypto++ 7.0:您需要同时提供 KeyDerivationFunction 和 HKDF 的文件。

换句话说,如果您尝试将 Crypto++ 7.0 HKDF 与 Crypto++ 5.6.2 一起使用,那么它将永远无法编译,因为库中缺少 KeyDerivationFunction


这应该不是问题,我错过了什么吗?

我认为您的问题可能取决于您的发行版(或提供 Crypto++ 的任何人)。如果您提供有关分发的详细信息和他们提供的库版本,我们可以说更多。

冒险猜测... Debian 和 Fedora 与 Crypto++ 版本保持同步。或者他们在过去几年中一直如此。所以您可能使用 Debian 8、Ubuntu 17、Fedora 22 或它们各自的变体。

但是,您可能使用的是 Debian 7 或更早版本、Ubuntu 12 或更早版本,或者 Fedora 21 或更早版本。在这种情况下,我相信您使用的是 Crypto++ 5.6.2。

我相信 Gentoo、BSD 和其他一些在发布曲线上落后了。据我所知,一些发行版仍在提供 Crypto++ 5.6.2。

【讨论】:

这正是我所假设的(它应该已经存在),但事实并非如此,所以我应该如何检查我正在使用的 crypto++ 库的版本。其次,我使用的是 Ubuntu 16.04,所以应该不是问题 我不明白。为什么你写了如何为 crypto++ 7.0 编写 wget hkdf.h。 7.0 不应该已经包含这个标题了吗?为什么我要问:在我的 Debian 9 上,我有 crypto++ 5.6.4,但它也不包含 hkdf.h……不知道为什么。 @alexey - 图书馆于 2015 年 7 月 8 日在Crypto++ 5.6.3 添加了 HKDF。这是一个独立的类。该库于 2018 年 3 月 29 日在 Crypto++ 7.0 添加了一个 KeyDerivationFunction 基类。 HKDF 已更改为从基类继承。对于 Crypto++ 5.6.4,您只需要 HKDF。对于 Crypto++ 7.0,您需要基类和 HDKF。

以上是关于在 Crypto++ 库中找不到 hkdf.h的主要内容,如果未能解决你的问题,请参考以下文章

x:在用户控件库中找不到类型

UnifiedNativeAdView,在项目或库中找不到

在项目或库中找不到清单中引用的类

SBT 在本地 maven 存储库中找不到文件,尽管它在那里

Maven:包括在公共存储库中找不到的 jar

在应用程序扩展中找不到库中的 cocoapods