2013-02-26 3 views
1

Я пытаюсь подтвердить/получить значение unsigned int (base 10/decimal) значения hexdd mpi. Я использую следующий код:Печать unsigned int (базовое 10/десятичное) значение MPI

#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 

Я бы «результат:» строки для печати фактических неподписанных Int (база 10/десятичных) стоимость.

Закрытый ключ берет с подключаемого модуля Off-The-Record Pidgin, с которым я пытаюсь работать.

EDIT:

кто-нибудь может подтвердить, что фактические неподписанные Int (база 10/десятичной) значение должно быть

Я мог бы обновить программу для создания новый mpi в gcrypt с этим значением и посмотреть, совпадает ли значение HEX с тем, что у меня уже есть. Я сделаю это позже сегодня.

EDIT 2:

Так что я пытаюсь сделать следующее, чтобы напечатать значение HEX в 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 

EDIT 3:

Я обновил пост немного, в основном я пытаюсь напечатать значение десятичного base10 шестнадцатеричного значения, которое генерируется библиотекой gcrypt. Я ищу это значение, чтобы подтвердить реализацию, которую я сделал для чтения этих значений. Я искал функцию gcrypt для достижения этой цели. Кажется, что gcrypt не поддерживает это?

+0

Итак ... вы пишете крипто lib и застряли на преобразовании шестнадцатеричного значения в десятичное значение? – Shark

+0

Я обновил сообщение, в основном, я пытаюсь получить базовое 10/десятичное значение значения hex'd, которое генерируется библиотекой gcrypt. – invalidusername

ответ

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; 

Эта строка помещает нулевые байты в байты по смещению 1 в result. Я не вижу, где вы когда-либо инициализировали байт при смещении ноль, но байты в смещениях 2 и более поздних версиях находятся за концом строки, которую вы создали.Строка это форматирование начинается в результате + 5, так это то, что вы должны напечатать здесь:

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

благодарит за ваши комментарии. Я обновил этот пример. Теперь он печатает «мусор». Я ищу фактическое число для печати. – invalidusername

+1

Ну, \ x48 - это H, \ x21 - это!, Поэтому он очень похож на «FMT_USG», просто копирует двоичные значения, т. Е. «Целое число» не означает «печатное целое число», а «двоичное целое». – jthill

+0

Спасибо, я написал пример приложения в C#, анализируя эти данные, и получил результат, как указано в редакции. Я обновлю свою программу и посмотрю, соответствует ли она. – invalidusername

Смежные вопросы