具有 GMP 的 SIGSEGV
SIGSEGV with GMP
我正在尝试生成一个数字 e,它是两个数字(p 和 q)的乘积。
但我什至无法 运行 代码...我遇到了分段错误,我确定那是什么 simple/importante 但我真的想不通:
void PubKeyED(mpz_t e,mpz_t d,mpz_t p,mpz_t q){
unsigned long int cmp,cont,seed;
mpz_t pq,gcdpq;
cont=1;
mpz_inits(pq,gcdpq);
mpz_sub_ui(p,p,cont);
mpz_sub_ui(q,q,cont);
mpz_mul(pq,p,q);
seed = time(NULL);
gmp_randstate_t init;
gmp_randinit_mt(init);
gmp_randseed_ui(init, seed);
do
{
mpz_urandomm(e, init, pq);
mpz_gcd (gcdpq, e, pq);
cmp=mpz_cmp_ui(gcdpq,cont);
if (cmp==0)
{
cont=0;
}
} while (cont);
}
int main(){
mpz_t e,d,p,q;
mpz_inits(p,q,e,d);
mpz_set_ui (p, 17);
mpz_set_ui (q, 23);
PubKeyED(e,d,p,q);
}
我是 gmp 的新手,对 C 不太熟悉。
如果你 read the documentation mpz_inits
你会看到它
Initialize a NULL
-terminated list of mpz_t variables
[强调我的]
您的代码存在的问题是您传递的参数列表不是“NULL
终止的”。
您需要像这样更换电话:
mpz_inits(p,q,e,d,NULL); // End argument list with a null pointer
mpz_inits
的参数需要 NULL
终止:
mpz_inits(pq,gcdpq,NULL);
mpz_inits(p,q,e,d,NULL);
我正在尝试生成一个数字 e,它是两个数字(p 和 q)的乘积。
但我什至无法 运行 代码...我遇到了分段错误,我确定那是什么 simple/importante 但我真的想不通:
void PubKeyED(mpz_t e,mpz_t d,mpz_t p,mpz_t q){
unsigned long int cmp,cont,seed;
mpz_t pq,gcdpq;
cont=1;
mpz_inits(pq,gcdpq);
mpz_sub_ui(p,p,cont);
mpz_sub_ui(q,q,cont);
mpz_mul(pq,p,q);
seed = time(NULL);
gmp_randstate_t init;
gmp_randinit_mt(init);
gmp_randseed_ui(init, seed);
do
{
mpz_urandomm(e, init, pq);
mpz_gcd (gcdpq, e, pq);
cmp=mpz_cmp_ui(gcdpq,cont);
if (cmp==0)
{
cont=0;
}
} while (cont);
}
int main(){
mpz_t e,d,p,q;
mpz_inits(p,q,e,d);
mpz_set_ui (p, 17);
mpz_set_ui (q, 23);
PubKeyED(e,d,p,q);
}
我是 gmp 的新手,对 C 不太熟悉。
如果你 read the documentation mpz_inits
你会看到它
Initialize a
NULL
-terminated list of mpz_t variables
[强调我的]
您的代码存在的问题是您传递的参数列表不是“NULL
终止的”。
您需要像这样更换电话:
mpz_inits(p,q,e,d,NULL); // End argument list with a null pointer
mpz_inits
的参数需要 NULL
终止:
mpz_inits(pq,gcdpq,NULL);
mpz_inits(p,q,e,d,NULL);