2013-02-26 61 views
1

我試圖確認/得到hex'd mpi值的無符號整數(基10 /十進制)值。我使用下面的代碼:打印MPI的無符號整數(基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 

我會在「結果:」行打印的實際unsigned int類型(基於10 /十進制)值。

私鑰是從我試圖使用的Off-the-Record Pidgin插件中取得的。

編輯

有誰能夠確認實際unsigned int類型(基數爲10 /十進制)值應

我大概可以更新程序來創建用這個值加密一個新的mpi,看看HEX的值是否與我已有的相同。我今天晚些時候會這樣做。

編輯2

,所以我嘗試做以下印刷上述int值的十六進制值。事情錯:

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

我更新了帖子了一下,基本上我要打印的base10十進制值由gcrypt庫生成的十六進制值。我正在尋找這個值來確認我讀取這些值的實現。我正在尋找一個gcrypt函數來實現這一點。看來gcrypt不支持這個?

+0

所以......你正在寫一個加密庫,並被卡在將十六進制值轉換爲十進制值? – Shark 2013-02-28 11:41:09

+0

我更新了帖子,基本上我試圖獲取由gcrypt庫生成的hex'd值的基10 /十進制值。 – invalidusername 2013-02-28 19:53:48

回答

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; 
} 

我也證實使用本網站我的想法:http://www.unitconversion.org/numbers/base-10-to-base-16-conversion.html

這將顯示十六進制(基數爲16)48BFDA215C31A9F0B226B3DB11F862450A0F30DA實際是415325779662433762080404206464628666084640 806848(base-10)

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

這條線把一個NUL字節到字節偏移量1到result。我沒有看到你在哪裏初始化偏移量爲0的字節,但偏移量爲2及以後的字節超過了你構建的字符串的末尾。它的格式化字符串開始於結果+ 5,所以這是你應該打印的內容在這裏:

gcry_mpi_print (GCRYMPI_FMT_USG, result + 5, gablen, NULL, privkey); 
... 
printf("result: %s\n", result + 5); 
+0

感謝您的反饋。我更新了這個例子。它現在打印'垃圾'。我正在尋找要打印的實際數字。 – invalidusername 2013-02-26 05:28:37

+1

好吧,\ x48是H,\ x21是!!,所以它看起來非常像'FMT_USG'只是複製二進制值,即「整數」並不意味着「可打印的整數」,而是「二進制整數」。 – jthill 2013-02-26 06:08:58

+0

謝謝,我在C#中編寫了一個示例應用程序,解析該數據並獲得了編輯中提到的結果。我會更新我的程序,看看是否匹配。 – invalidusername 2013-02-26 19:52:52