Вывести большое целое число в виде длинного массива без знака - PullRequest
0 голосов
/ 14 апреля 2020

Я проверяю безопасность приложения для университетского проекта, приложение шифрует файл с использованием RSA, в частности использует эту библиотеку: https://github.com/ilansmith/rsa (НЕ используйте это, оно имеет серьезные уязвимости ).

(Если вы хотите посмотреть, большинство операций между этими числами реализованы в файле rsa_num.c.)

Этот инструмент использует массивы unsigned long long для хранения большие числа, необходимые для RSA (n, e и d):

typedef struct {
    u64 arr[17]; //u64 is defined as unsigned long long
    int top;     //points to the last occupied slot of the array
} u1024_t;

Проблема в том, что я не понимаю, как числа хранятся в этом формате. Что мне нужно, так это возможность каким-то образом печатать действительные числа или, по крайней мере, способ восстанавливать числа из компонентов массивов.

Я попытался просто объединить их как строки, но это не так кажется правильным.

Спасибо тому, кто сможет помочь!

1 Ответ

1 голос
/ 14 апреля 2020

Спасибо @ Матье ! Ваш комментарий сработал. Мне нужно было объединить unsigned long long s в обратном порядке и обратить их байты из-за порядка байтов.

Следуя его решению, я реализовал эту функцию, которая прекрасно работает:

void print_u1024(u1024_t number) {
    int size = (number.top + 1) * sizeof(u64);
    for (int i = size-1; i >= 0; i--) {
        printf("%02x", ((unsigned char*)number.arr)[i]);
    }
    printf("\n");
}

Обратите внимание что это решение, вероятно, будет работать только на системах с прямым порядком байтов (большинство компьютеров).

...