1

16進数のmpi値のunsignedint(基数10 / 10進数)値を確認/取得しようとしています。私は次のコードを使用しています:

#include <gcrypt.h>
#include <stdio.h>

static gcry_mpi_t privkey = NULL;

int main(){

    char *parmstr = "48BFDA215C31A9F0B226B3DB11F862450A0F30DA";

    printf("starting program\n");

    gcry_mpi_scan(&privkey, GCRYMPI_FMT_HEX, (char *)parmstr, 0, NULL);

    printf("printing hashed (?) mpi\n");
    gcry_mpi_dump(privkey);
    printf("\n");

    size_t gablen;
    unsigned char *result;
    /* get length */
    gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &gablen, privkey);
    result = gcry_malloc_secure(gablen);
    /* get actual value */
    gcry_mpi_print (GCRYMPI_FMT_USG, result, gablen, NULL, privkey);

    /* print actual value */
    printf("result: %s\n", result);

    printf("finished\n");
}

そして私は次の結果を得ています:

    $ ./foo
    starting program
    printing hashed (?) mpi
     48BFDA215C31A9F0B226B3DB11F862450A0F30DA
    result: H¿Ú!\1©ð²&³ÛøbE
0Ú
    finished

'result:'行を使用して、実際のunsigned int(基数10 / 10進数)値を出力します。

秘密鍵は、私が使用しようとしているOff-The-RecordPidginプラグインから取得しています。

編集

実際のunsignedint(基数10 / 10進数)の値が

415325779662433871844955547383752003988573073626

プログラムを更新して、この値を使用してgcryptに新しいmpiを作成し、HEX値がすでに持っている値と同じであるかどうかを確認できます。これは今日の後半に行います。

編集2

だから私は上記のint値のHEX値を出力するために次のことをしようとしています。何か問題が発生しています:

gcry_mpi_t cript_prime;
char buffer[50] = {0};
char number[50] = {0};

cript_prime = gcry_mpi_new(50);

strcpy(number,"415325779662433871844955547383752003988573073626");
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);

printf("trying to convert to HEX\n");

/* get actual value */
gcry_mpi_print (GCRYMPI_FMT_HEX, buffer, sizeof(buffer), NULL, cript_prime);
/* print actual value */
printf("result: %s\n", buffer);

出力は次のとおりです。

result: 48BFDA215C31A9F0B226B3DB11F862450A0F30DA
The number tested is: 415325779662433871844955547383752003988573073626
trying to convert to HEX
result: 415325779662433871844955547383752003988573073626

編集3

投稿を少し更新しました。基本的には、gcryptライブラリによって生成された16進値の10進数のbase10値を出力しようとしています。これらの値を読み取るために作成した実装を確認するために、この値を探しています。これを実現するためのgcrypt関数を探していました。gcryptはこれをサポートしていないようですか?

4

2 に答える 2

1
result[1] = (gablen >> 24) & 0xff;

この行は、nulバイトをオフセット1のバイトに入れresultます。オフセット0でバイトを初期化した場所はわかりませんが、オフセット2以降のバイトは、作成した文字列の終わりを超えています。フォーマットする文字列はresult+5から始まるので、ここに出力する必要があります。

gcry_mpi_print (GCRYMPI_FMT_USG, result + 5, gablen, NULL, privkey);
...
printf("result: %s\n", result + 5);
于 2013-02-26T03:44:38.997 に答える
1

これが動作するスクリプトです。バッファが小さすぎました

#include <gcrypt.h>
#include <stdio.h>

int main(){
    gcry_error_t err;
    gcry_mpi_t cript_prime;
    unsigned char buffer[401] = {0};
    char number[101] = {0};

    cript_prime = gcry_mpi_new(101);

    strcpy(number, "415325779662433871844955547383752003988573073626");
    gcry_mpi_scan(&cript_prime, GCRYMPI_FMT_USG, number, sizeof(number), NULL);

    err = gcry_mpi_print(GCRYMPI_FMT_USG, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      printf("error: %d\n", err);
      return -1;
    }

    printf("The number tested is: %s\n",buffer);

    printf("trying to convert to HEX\n");

    /* get actual value */
    err = gcry_mpi_print(GCRYMPI_FMT_HEX, buffer, sizeof(buffer), NULL, cript_prime);

    if (err != 0){
      gcry_err_code_t code = gcry_err_code(err);
      printf("error: %d\n", code);
      return -1;
    }

    /* print actual value */
    printf("result: %s\n", buffer);

    printf("finished\n");

    return 0;
}

また、次のWebサイトを使用して自分の考えを確認しました:http://www.unitconversion.org/numbers/base-10-to-base-16-conversion.html

これは、16進数(基数16)48BFDA215C31A9F0B226B3DB11F862450A0F30DAが実際には415325779662433762080404206464628666084640806848(基数10)であることを示します。

于 2013-03-01T03:02:13.993 に答える