目前我正在模拟我的加密方案来测试它。我已经开发了代码,但我一度陷入困境。
我想尝试:g**x
g = 256 bit number
x = 256 bit number
Python挂起了这一点,我已经阅读了很多论坛,线程等,但只得出结论python挂起,因为它很难处理这么大的数字。
任何想法怎么做?任何两行代码,任何库,任何可以完成的事情。
答案 0 :(得分:13)
它不是悬挂,它只是处理。它将最终给你答案,前提是它没有先耗尽内存。
我还没有听说过在密码学中使用这种过程的结果;通常,重要的是所述功率的模数。如果你的情况相同,那么你可以使用pow()
的3参数形式。
答案 1 :(得分:11)
您不应该尝试直接计算x ^ y以获得巨大的y值 - 正如已经指出的那样,这很难做到(占用大量空间和处理能力)。您需要查看使用较少乘法运算为您解决问题的算法。首先看一下:http://en.wikipedia.org/wiki/Exponentiation_by_squaring。
模块化取幂也很清楚:http://en.wikipedia.org/wiki/Modular_exponentiation。
您需要将python库用于大数字,例如http://gmpy.sourceforge.net/。
如果有任何帮助,我使用mpir在C中进行模幂运算。我会附上那些代码,你当然需要把它转换成python。
int power_modn( mpz_t c, mpz_t b, mpz_t e, mpz_t n)
{
mpz_t result;
mpz_t one;
mpz_t r;
mpz_t modulus; mpz_t exponent; mpz_t base;
mpz_init(modulus); mpz_init(exponent); mpz_init(base);
mpz_init(result); mpz_init(one); mpz_init(r);
mpz_set_ui(result, 1);
mpz_set_ui(one, 1);
mpz_set(base, b);
mpz_set(exponent, e);
mpz_set(modulus, n);
while ( mpz_cmp_ui(exponent, 0) > 0 )
{
if ( mpz_mod_ui( r, exponent, 2) == 1 )
{
mpz_mul(result, result, base);
mpz_mod(result, result, modulus);
};
mpz_mul(base, base, base);
mpz_mod(base, base, modulus);
mpz_fdiv_q_ui(exponent, exponent, 2);
}
mpz_set(c, result);
return 0;
}
答案 2 :(得分:9)
我不太确定你是否赞赏你要求Python做的事情。将某些东西提升到x
,其中x
是256位长,相当于2 ** 256次乘法,或115792089237316195428470985008687907853269984665640564039457584007913129639936乘法。你可以想象,这可能需要一些时间。和空间,我保证你没有足够的空间。