如何在 MinGW 32 位编译器中处理 128 位变量以在 Qt 中进行加密(Diffie Hellman 算法)

How to deal with 128bit variable in MinGM32 bit compiler for Encryption (Diffie Hellman Algorithm) in Qt

我想在其中一个代码中使用下面的等式

A = g^a mod p; //g 提高到 modulus p.

(类似于 2^5 % 3)= 32%3 = 2

(这个等式看起来像安全的 Diffie Hellman 算法)

其中:

我正在使用:

下面列出了我发现的对我不起作用的解决方案:

  1. 一个人可以使用 __int128 但为了支持那个人应该使用 最新的 GCC 编译器或 MinGW64 位编译器,我现在都没有使用。

  2. 我发现一个最新版本的 Qt 有 QSslDiffieHellmanParameters class, 但同样在我们的 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,
  1. 我尝试使用 Bigint,它更有用,但又一次 5^(128bit number) 太大了,计算东西需要几个小时, (我等到 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);

这不是模幂运算的方法!第一个问题是 5 ^ 128_bit_variable 巨大的 ,大到今天任何计算机的内存都装不下。要将所需的存储空间 space 保持在一定范围内,您必须在每次操作后取余数 % myPVal

第二个问题是,您不能简单地通过将 5 乘以自身 128_bit_variable 次来计算 5 ^ 128_bit_variable -- 这将花费比宇宙年龄更长的时间。您需要使用求幂阶梯,它只需要 128 次平方和最多 128 次乘法。有关详细信息,请参阅 this Wikipedia article。最后,操作 5 ^ 128_bit_number 应该只需要几分之一秒。