Как работать с 128-битной переменной в MinGM32-битном компиляторе для шифрования (алгоритм Диффи-Хеллмана) в Qt - PullRequest
0 голосов
/ 10 мая 2019

Я хочу использовать приведенное ниже уравнение в одном из кодов

A = g ^ a mod p;// g повышаем до модуля p.

(что-то вроде 2 ^ 5% 3) = 32% 3 = 2

(это уравнение выглядит как алгоритм Диффи-Хеллмана для безопасности)

Где:

  • ^ - это (мощность)
  • g - это фиксированное число 0x05
  • a - это 128-битное (16-байтовое) случайное число,
  • p - фиксированное шестнадцатеричное число 128 бит (16 байтов).Что-то вроде (0x0xD4A283974897234CE908B3478387A3).

Я использую:

  • Qt 4.8.7
  • Компилятор MinGW32 (проверено с повышением библиотеки надстроек 1.70)

Решения, которые я нашел, которые не работали для меня, перечислены ниже:

  1. можно использовать __int128, но для поддержки этого следует использовать последний компилятор GCCили MinGW64-битный компилятор, ни того, ни другого, который я сейчас использую.

  2. Я обнаружил, что одна последняя версия Qt имеет класс QSslDiffieHellmanParameters, но опять-таки не поддерживается в нашей версии Qt.

  3. Я обнаружил, что некоторые библиотеки, такие как boost / multiprecision / cpp_int.hpp (boost 1.70)), имеют тип данных, например int128_t и int256_t, но из-за проблемы с нашим компилятором или чего-то еще мы не можемсохранить 128-битное число, то есть, если я это сделаю:

    int128_t ptval128 = 0xAB1232423243434343BAE3453345E34B;
    cout << "ptval128 = " << std::hex << ptval128 << endl;
    //will print only 0xAB12324232434343;//half digits only,
Я попытался использовать Bigint, который гораздо более полезен, но опять же 5 ^ (128-битное число) слишком велико, для вычисления требуются часы (я ждал до 1 часа и 16 минут и убивал приложение).
    int myGval = 0x05;
    128_bit_data_type myPVal= 0xD4A283974897234CE908B3478387A3; 

    128_bit_data_type 128_bit_variable = 128_bit_random_data;
    myVal = (myGval)^(128_bit_variable) % (myPVal);

1 Ответ

0 голосов
/ 10 мая 2019

Это не то, как сделать модульное возведение в степень! Первая проблема заключается в том, что 5 ^ 128_bit_variable - это огромный , такой большой, что он не помещается в память на любых компьютерах, доступных сегодня. Чтобы сохранить необходимое пространство для хранения в пределах, вы должны брать остаток % myPVal после каждой операции.

Вторая проблема заключается в том, что вы не можете вычислить 5 ^ 128_bit_variable, просто умножив на 5 само по себе 128_bit_variable раз - это займет больше времени, чем возраст вселенной. Вам нужно использовать лестницу возведения в степень, для которой требуется только 128 квадратур и самое большее 128 умножений. Подробности смотрите в этой статье Википедии . В конце операция 5 ^ 128_bit_number должна занять долю секунды.

...