【问题标题】:C Libgcrypt: Unable to check if number is prime using libgcryptC Libgcrypt:无法使用 libgcrypt 检查数字是否为素数
【发布时间】:2012-07-13 05:05:19
【问题描述】:

我正在使用 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 输出传递给质数检查功能时...它通过了!

【问题讨论】:

    标签: c linux testing primes libgcrypt


    【解决方案1】:

    这是一个错误。像大多数素数测试一样,它在进行更昂贵的测试之前测试小素数的可分性。不幸的是,如果您的质数是这些值之一,则它被报告为 可整除(单独) - 因此是复合的。

    由于 libgcrypt 的重点是加密应用程序,所以这么小的素数没有用处。不过这很草率,而且不需要太多时间来纠正。

    【讨论】:

    • 但素数生成体系结构的手册gnupg.org/documentation/manuals/gcrypt/… 指出以下The standard sieve algorithm using the primes up to 4999 is used as a quick first check.
    • 相当。所以,我敢打赌4999 被宣布为合数,5003 被宣布为素数。
    • 我试了5003,还是一样的结果。会一直尝试到大概 9973 年
    【解决方案2】:

    这是函数原型,它有一个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函数进行设置。

    【讨论】:

    • hmmm gcry_prime_check(...,unsigned int flags) 没有关于此的文档。我试过从 0 到 4 的整数。所有的结果都一样。
    • mpi.h 包含一个结构定义 struct gcry_mpi{ int alloced; /* 数组大小(分配的肢体数)。 /int nlimbs; / 有效肢体的数量。 /int 符号; / 表示负数,也用于不透明的 MPI 存储长度。 /无符号整数标志; / 位 0:要在安全内存空间中分配的数组。*/ /* 位 2:肢体是指向某些 m_alloced 数据的指针。*/ mpi_limb_t d; / 带四肢的数组 */ };` 好像只用到了bit 0和bit 2,而且只用于内存管理。
    • 在 prime_check 函数定义中根本不考虑 unsigned int 标志
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多