如何在 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 算法)
其中:
- ^是(幂)
- g为定数0x05
- a是128bit(16bytes)随机生成的数,
- p 是 128 位(16 字节)的固定十六进制数。类似于 (0x0xD4A283974897234CE908B3478387A3).
我正在使用:
- Qt 4.8.7
- 编译器 MinGW32(使用 boost 库 boost 1.70 检查)
下面列出了我发现的对我不起作用的解决方案:
一个人可以使用 __int128 但为了支持那个人应该使用
最新的 GCC 编译器或 MinGW64 位编译器,我现在都没有使用。
我发现一个最新版本的 Qt 有 QSslDiffieHellmanParameters class,
但同样在我们的 Qt 版本中不受支持。
我找到了一些库,例如 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^(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
应该只需要几分之一秒。
我想在其中一个代码中使用下面的等式
A = g^a mod p; //g 提高到 modulus p.
(类似于 2^5 % 3)= 32%3 = 2
(这个等式看起来像安全的 Diffie Hellman 算法)
其中:
- ^是(幂)
- g为定数0x05
- a是128bit(16bytes)随机生成的数,
- p 是 128 位(16 字节)的固定十六进制数。类似于 (0x0xD4A283974897234CE908B3478387A3).
我正在使用:
- Qt 4.8.7
- 编译器 MinGW32(使用 boost 库 boost 1.70 检查)
下面列出了我发现的对我不起作用的解决方案:
一个人可以使用 __int128 但为了支持那个人应该使用 最新的 GCC 编译器或 MinGW64 位编译器,我现在都没有使用。
我发现一个最新版本的 Qt 有 QSslDiffieHellmanParameters class, 但同样在我们的 Qt 版本中不受支持。
我找到了一些库,例如 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^(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
应该只需要几分之一秒。