【发布时间】:2015-02-03 20:29:09
【问题描述】:
我正在尝试实现一个库中定义的函数,但我在使用它时遇到了问题。 This问题帮我实现了,但是我不能用这个功能。
这里是类型定义:
typedef void (*paillier_get_rand_t) ( void* buf, int len );
这是我的实现方式:
void get_rand(void* buf, int len) {
buf = (void *)rand(); // I don't know if it works but isn't the problem
}
以及我如何创建指向函数的指针并调用它。
int modulus = 4;
void* buf;
paillier_pubkey_t* pub;
paillier_prvkey_t* prv;
paillier_keygen(modulus, &pub, &prv, &get_rand);
问题1)如何发送参数buf和len? 问题2)现在错误不同了:
reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))' undefined
函数paillier_keygen用于生成算法各自的密钥,函数get_rand用于获取概率算法所需的随机性。
我正在实现这个 typedef,因为我需要这样做才能使用 lib。
编辑:
我找到了一个已经定义的函数,我可以使用它,称为paillier_get_rand_devurandom。
/* 这些函数可以传递给 paillier_keygen 和 paillier_enc 函数提供随机数的来源。这 首先从 /dev/random 读取字节。在 Linux 上,此设备 仅返回从环境噪声中收集的熵和 因此,当没有足够的可用时经常阻塞。第二 从 /dev/urandom 返回字节。在 Linux 上,此设备也返回 环境噪声,但增加了一个伪随机数 发电机不足时可用。后者大概是 更好的选择,除非你有特定的理由相信它 不足的。 */
void paillier_get_rand_devurandom( void* buf, int len );
如果我像以前一样使用
paillier_keygen(modulus, &pub, &prv, paillier_get_rand_devurandom(buf, 4));
我收到error: invalid use of void expression
如果我这样使用:
paillier_keygen(modulus, &pub, &prv, &paillier_get_rand_devurandom);
我明白了:
undefined reference to `paillier_get_rand_devurandom(void*, int)'
undefined reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))'
包括图书馆。在这里,我添加了有关签名的更多信息:
/* 使用随机性生成长度模数位的密钥对 提供 get_rand 函数。空间将被分配给每个 键,并且给定的指针将被设置为指向新的 paillier_pubkey_t 和 paillier_prvkey_t 结构。功能 paillier_get_rand_devrandom 和 paillier_get_rand_devurandom 可能是 作为最终参数传递。 */
void paillier_keygen( int modulusbits,
paillier_pubkey_t** pub, paillier_prvkey_t** prv, paillier_get_rand_t get_rand );
/* 这是用于获取回调函数的类型 概率算法所需的随机性。功能 paillier_get_rand_devrandom 和 paillier_get_rand_devurandom (稍后记录)可以传递给任何需要 paillier_get_rand_t,或者您可以实现自己的。如果你实施 你自己的这样的功能,它应该填写“len”随机字节 数组“buf”。 */
typedef void (*paillier_get_rand_t) ( void* buf, int len );
【问题讨论】:
-
尝试
paillier_get_rand_t fnPtr = &getRand;并将fnPtr作为参数传递。 -
我猜
paillier_pubkey_t** pub;是错误的,你应该使用paillier_pubkey_t* pub;并使用&pub传递给函数。 (即它可能需要一个指向它可以访问的内存的指针,你正在提供一些会崩溃的访问)。 -
buf = (void *)rand(); // I don't know if it works but isn't the problem毫无意义。 -
你定义了一个类型
paillier_get_rand_t,但是你永远不会在任何地方使用它。这向我表明您要么遗漏了重要代码,要么在某处有错字,要么您完全不知道自己在做什么(在这种情况下,您可能应该停下来。您要做什么?如果您'试图做的是理解 C++ 的每一个角落和缝隙,而你没有更大的目的,停下来。那是浪费时间。C++ 充满了重叠的功能。你可能已经知道一些同样有效的方法来完成同样的事情这个构造可能会做的事情。) -
@ArtOfWarfare 这是我第一次使用这种函数和指针。我需要实现它以与库一起工作,这可以帮助我在我正在实现的协议中进行加密。