gpt4 book ai didi

c - 什么是 openwall crypt_r 的数据参数?

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:44 24 4
gpt4 key购买 nike

char *crypt_r(const char *key, const char *setting, void *data)

应该传递什么作为数据参数?我找不到这方面的文档。 Linux 版本使用 crypt_data 类型,但此 header 中不可用。

http://www.openwall.com/crypt/

最佳答案

这是一个棘手的接口(interface),因为它想要分配并回收大小对调用者不透明的对调用者不透明的缓冲区,这在 C 中并不容易。

如果我正在阅读 OpenWall crypt(3) manpage (PDF) 正确,您应该能够获得 crypt_data通过定义 _GNU_SOURCE 声明的结构在包含任何系统头文件之前(不仅仅是在包含 crypt.h 之前)。或者,您可以使用 crypt_ra ,像这样的东西。 (注意:C++ <string><vector> 用于避免一堆乏味的内存分配,这会掩盖示例的重要部分。出于同样的原因,失败时崩溃行为。根本没有测试;甚至没有编译.)

#define _OW_SOURCE
#include <crypt.h>
#include <string>
#include <vector>

using std::vector;
using std::string;

void crypt_many(vector<string> &encrypted,
vector<string> const &passwords,
const char *setting)
{
void *buffer = 0;
int bufsiz = 0;

encrypted.clear();
encrypted.reserve(passwords.size());
for (auto p = passwords.begin(), limit = passwords.end();
p != limit; p++)
{
char *enc = crypt_ra(p->c_str(), setting, &buffer, &bufsiz);
if (!enc) abort();
encrypted.push_back(string(enc));
}

free(buffer);
}

第一次调用 crypt_ra , 它使用 malloc 分配了一些内存并将其存储在 buffer 中(以及 bufsiz 中的大小),并进行一些预计算,其结果保存在 buffer 中;返回的 enc指针也指向那里。在随后的调用中,它会重用空间和预先计算的表,如果它发现缓冲区不够大,它可能会调整缓冲区大小(这就是缓冲区大小是一个参数的原因)。你,来电者,不要碰bufferbufsiz完全没有,除了你有责任释放buffer当你用完 crypt_ra .

关于c - 什么是 openwall crypt_r 的数据参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43721265/

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