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

hkdf.h not found in Crypto++ library

本文关键字:找不到 Crypto++ hkdf      更新时间:2023-10-16

我不能将加密++库中的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:

如何检查我的加密++库的版本? 下载命令是:

sudo apt-get install libcrypto++-dev

我的操作系统是 Ubuntu 16.04

编译命令:

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

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

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

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

您可以在 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。但是,您必须自己从源代码下载并构建库,以确保库和程序使用相同的标志。

如果您自己构建库,请参阅 GNUmakefile |在 Crypto++ wiki 上构建库。

如果您自己构建库,请帮自己一个忙并删除发行版提供的库版本。像sudo apt-get remove --purge libcrypto++ libcrypto++-dev libcrypto++-dbg.否则,您将无意中混合和匹配它们。

不能将加密++库中的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。