我在C ++中有一个名为source.cpp的代码。我在C中有一个库。我使用Cygwin并运行:g ++ source.cpp -L / cygdrive / c / cygwin / home / Win7 / libpaillier -l:libpaillier.a -lgmpxx -lgmp创建一个.exe文件然后运行。最后我得到了#34;分段错误(核心转储)"。我需要知道为什么我会收到此错误。
Source.cpp:
#include<iostream>
#include<gmp.h>
#include <gmpxx.h>
using namespace std;
#include <string>
extern "C"{
#include<paillier.h>
}
#include<math.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
paillier_pubkey_t* pu;//The public key
paillier_prvkey_t* pr;//The private key
paillier_get_rand_t get_rand;
paillier_keygen(1024, &pu,&pr, get_rand );
return 0;
}
Paillier图书馆:http://acsc.cs.utexas.edu/libpaillier/
答案 0 :(得分:1)
您需要将有效的随机生成器作为paillier_keygen
的最后一个参数传递。该库提供了两个您可以使用的文件:
paillier_keygen(1024, &pu,&pr, paillier_get_rand_devrandom);
paillier_keygen(1024, &pu,&pr, paillier_get_rand_devurandom);
答案 1 :(得分:0)
您已声明指向随机函数(paillier_get_rand_t get_rand;
)的指针,但尚未将其初始化为指向函数。现在,当您将此指针传递给试图调用它应该指向的函数的paillier_keygen
时,您会得到一个段错误。
正如@TartanLlama所提到的,有问题的库提供了两个随机数生成函数,您可以使用它们初始化指针(或直接将它们传递给函数):paillier_get_rand_devrandom
和paillier_get_rand_devurandom
。
您还可以使用其他RNG功能。只需确保它有一个与所讨论的函数指针类型兼容的标头:typedef void (*paillier_get_rand_t) ( void* buf, int len );
(relevant SO question)。此外,您希望它符合库的要求,即生成len
个字节的随机字节序列并将其存储在buf
中。
编辑:我最初误读了你的代码,这就是我谈到几个指针的原因