gpt4 book ai didi

c++ - Crypto++ pbkdf2::DeriveKey() 罕见崩溃

转载 作者:行者123 更新时间:2023-11-30 02:17:48 25 4
gpt4 key购买 nike

我正在使用 CryptoPP 库来散列一些密码。大约 10 次中有 1 次,它在下面的 DeriveKey 行崩溃,并出现段错误。

即使使用固定参数,崩溃似乎仍然是随机的。我想知道我的字符串末尾是否需要一个“\0”。或者可能需要将输出缓冲区初始化为零,或者其他什么?

无论如何,这是代码。

#include <cryptopp/aes.h>
#include <cryptopp/algparam.h>
#include <cryptopp/filters.h>
#include <cryptopp/modes.h>
#include <cryptopp/sha.h>
#include <cryptopp/pwdbased.h>

int main()
{
CryptoPP::PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf2;

CryptoPP::byte salt[16];

CryptoPP::byte key[32];

/* Hard coded for testing purposes */
Common::podFromHex("00f8807a289655b2a8e38cda00182a32", salt);

/* Hard coded for testing purposes */
std::string password = "a";

std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
std::cout << "Salt size: " << sizeof(salt) << std::endl;
std::cout << "Password: " << password.data() << std::endl;
std::cout << "Password size: " << password.size() << std::endl;

/* Rare segfault on this line */
pbkdf2.DeriveKey(
key, sizeof(key), 0, (CryptoPP::byte *)password.data(),
password.size(), salt, sizeof(salt), Constants::PBKDF2_ITERATIONS
);
}

一切似乎都正确初始化 - 打印语句每次都给我完全相同的东西:

Salt: 00f8807a289655b2a8e38cda00182a32
Salt size: 16
Password: a
Password size: 1

此外 - 散列密码在没有段错误时可用。后面我用的是AES加密,可以完美解密文件,所有数据都符合预期。

derive key的源码可以在这里找到,顺便说一句:https://www.cryptopp.com/docs/ref/pwdbased_8h_source.html#l00235

谢谢。

最佳答案

我在冒险猜测,但是 salt 不是 NULL 终止的。该程序可能正在访问 salt 数组的第 16 个元素:

std::cout << "Salt: " << Common::podToHex(salt) << std::endl;

以下执行多次没有问题。这是您的程序减去对公共(public)库的调用。

std::memcpy 的调用只占用字符串最左边的 16 个字节。它不进行转换。 (我只想删除对 Common 的调用)。

$ cat test.cxx

#include "cryptlib.h"
#include "filters.h"
#include "sha.h"
#include "hex.h"
#include "files.h"
#include "pwdbased.h"

#include <string>
#include <iostream>
#include <cstring>

int main()
{
using namespace CryptoPP;

PKCS5_PBKDF2_HMAC<SHA256> pbkdf2;

byte salt[16], key[32];

/* Hard coded for testing purposes */
// Common::podFromHex("00f8807a289655b2a8e38cda00182a32", salt);
std::memcpy(salt, "00f8807a289655b2a8e38cda00182a32", 16);

/* Hard coded for testing purposes */
std::string password = "a";

// std::cout << "Salt: " << Common::podToHex(salt) << std::endl;
std::cout << "Salt: ";
StringSource(salt, sizeof(salt), true, new HexEncoder(new FileSink(std::cout)));
std::cout << std::endl;

std::cout << "Salt size: " << sizeof(salt) << std::endl;
std::cout << "Password: " << password.data() << std::endl;
std::cout << "Password size: " << password.size() << std::endl;

/* Rare segfault on this line */
pbkdf2.DeriveKey(
key, sizeof(key), 0, (byte *)password.data(),
password.size(), salt, sizeof(salt), 10000 /*Constants::PBKDF2_ITERATIONS*/
);

std::cout << "Key: ";
StringSource(key, sizeof(key), true, new HexEncoder(new FileSink(std::cout)));
std::cout << std::endl;

return 0;
}

编译并执行:

$ g++ -DNDEBUG -g2 -O3 test.cxx -o test.exe ./libcryptopp.a
$ ./test.exe
Salt: 30306638383037613238393635356232
Salt size: 16
Password: a
Password size: 1
Key: F88BA6947B802C66F7E7A2BC0099AFD92C81DC293E3CC48C2DA3FA75E27ECE6B

关于c++ - Crypto++ pbkdf2::DeriveKey() 罕见崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com