1

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出力をプライムチェック関数に直接渡すと...パスします!!

4

2 に答える 2

1

バグです。ほとんどの素数テストと同様に、より高価なテストに移る前に、小さな素数で割り切れるかどうかをテストします。残念ながら、素数がこれらの値の 1 つである場合、それは(それ自体で)割り切れると報告されるため、合成されます。

libgcrypt は暗号化アプリケーションに重点を置いているため、このような小さな素数には何の役にも立ちません。ただし、ずさんであり、修正するのにそれほど時間はかかりません。

于 2012-07-13T07:11:13.193 に答える
0

これは関数のプロトタイプで、gcry_mpi_t構造体と整数を取ります。

gcry_error_t gcry_prime_check (gcry_mpi_t p, unsigned int flags)

gcry_mpi_t: この型は、MPI を保持するオブジェクトを表します。

gcry_mpi_tgcry_mpi_new関数を使用して構造体を割り当てることができます

また、関数を使用して設定することもできますgcry_mpi_set

于 2012-07-13T05:24:24.863 に答える