我正在使用libgcrypt函数gcry_prime_check
来测试数字3
是否为素数。事实证明,根据我的功能,3不是素数。我做错了什么?
这是我的代码
#include <gcrypt.h>
#include <stdio.h>
int main(void)
{
gcry_mpi_t cript_prime;
gcry_error_t err;
char buffer[8] = {0};
char number[8] = {0};
printf("%s\n", gcry_check_version ( NULL ) );
gcry_control( GCRYCTL_INIT_SECMEM, 16384, 0 );
cript_prime = gcry_mpi_new(16);
strcpy(number,"3");
gcry_mpi_scan(&cript_prime,GCRYMPI_FMT_USG,number,sizeof(number),NULL);
gcry_mpi_print(GCRYMPI_FMT_USG,buffer,sizeof(buffer),NULL,cript_prime);
printf("The number tested is: %s\n",buffer);
err = gcry_prime_check(cript_prime,4);
if(err)
{
printf("%s\n",gcry_strerror(err));
}
gcry_mpi_release(cript_prime);
return 0;
}
这是输出
1.4.4
The number tested is: 3
Number is not prime
此外,有关使用libgcrypt的优秀教程的链接将是一个很大的好处。感谢
编辑:
好吧,我设法使用gcry_prime_generate
生成素数并将值复制到number
。结果证明它没有通过检查。但是当你直接将素数生成的mpi输出传递给素数检查函数时......它会通过!!
答案 0 :(得分:1)
这是一个错误。像大多数主要测试一样,它在进行更昂贵的测试之前,通过小的素数值测试可分性。不幸的是,如果你的素数是这些值中的一个,它被报告为 divisible (单独) - 因此是复合的。
由于libgcrypt的重点是加密应用程序,因此这样的小素数没有效用。虽然很草率,但不会花太多时间来纠正。
答案 1 :(得分:0)
这是函数原型,它采用gcry_mpi_t
结构和整数。
gcry_error_t gcry_prime_check (gcry_mpi_t p, unsigned int flags)
gcry_mpi_t
:此类型表示持有MPI的对象。
gcry_mpi_t
函数分配 gcry_mpi_new
个结构
可以使用gcry_mpi_set
功能设置。