在Python中强制整数溢出

时间:2017-11-03 16:13:10

标签: python python-2.7

我试图模仿python中用Java编写的东西。 Java部分中存在对称加密算法,其中密钥生成依赖于Java长整数溢出。我现在需要在Python中执行此操作才能在那里解密。我没有写加密算法,我无法改变它。这是Java中密钥生成器函数的一部分:

long a;
long b;
...
for (...)
    ...
    a = b + ((b << 1) + (b << 4) + (b << 7) + (b << 8) + (b << 35));

现在,当我将它复制到Python时,我会收到大量的数字,因为Python会执行它应该做的事情,并为我的整数添加更多字节,而在Java中,整数只是保持溢出而最终是64位键被返回。这不是整个代码,它实际上是一个循环,一直在做这个和其他东西到a和b,所以我不能只采取最高64位或类似的东西,并把它当作我的新a。

但是,我现在需要在Python中模拟这种行为以获取我的解密密钥。

我如何在Python中执行此操作?它是否可能,或者我是否需要依赖这部分的C函数,并在那里进行密钥生成?

2 个答案:

答案 0 :(得分:3)

如果将所有整数存储在numpy数组中,它们将溢出(因为numpy使用C进行算术运算)。

答案 1 :(得分:1)

无需使用numpy或任何其他外部库;原始Python足够强大,可以满足您的需求。虽然如果你可以用向量运算表达你的整个算法,那么numpy实现会快得多。

只需在你展示的那一行之后加上这一行,这就得到了模2的剩余部分给权力64:

a = a % 2**64

或者您可以使用此行,它按位AND与最后64位为1的数字:

a = a & ((1 << 64) - 1)

这两个陈述是等价的,性能差异可能微不足道。所以我建议选择对你最有意义的那个,这取决于你是否认为它更像是算术运算(第一个)或逐位运算。显然将64改为32或其他任何合适的。