有没有一种方法可以在java中pow 2 BigInteger数字



我必须用另一个bigInteger数给一个bigInteger数加幂。

遗憾的是,只允许使用一个BigInteger.pow(int(。

我不知道怎样才能解决这个问题。

我必须用另一个bigInteger数给一个bigInteger数加幂。

不,你没有。

你读了一个加密规范,它似乎是这么说的。但事实并非如此;你读得不够仔细。你正在阅读的论文/规范中的数学运算所处的数学"宇宙"与普通数学不同。这是一个模空间。所有运算都是以模X隐式执行的,其中X是加密算法解释的某个数字。

你可以做得很好。

或者,规范很清楚,上面写着:C = (A^B) % M,你已经把它分解成了几个步骤(……首先,我必须把A计算成B的幂。我稍后会担心%M部分是什么(。这不是怎么回事——你不能把操作分解成几个部分。(A^B) % M是可行的,并且有自己的高效算法。如果没有地球上几年的全部能源和GDP产出,(A^B)根本无法计算。

我知道这一定是你一直在读的内容,因为(A ^ B) % M是加密货币中的一个常见操作。(好吧,那个,还有一个简单的事实,A^B是不可能完成的(。

需要明确的是:当我说不可能时,我的意思是"以比光速更快的速度旅行"是不可能的。这是一个物理意义上的定律:如果你真的只想做a^B,而不是在B太大以至于不适合int的modspace中,计算机无法计算它,结果将是千兆字节。int可以容纳大约9位数字。只是为了好玩,想象一下做X^Y,其中X和Y都是20位数字。

结果将有10^21位数字。

这大约相当于全球可用磁盘空间的总量。10^12是一个TB。您要求计算一个数字,忘记计算,只需存储它就需要10亿个1TB的硬盘。

因此,我百分之百肯定你不想要你认为你想要的东西。

提示:如果你不能遵循数学(这很奇怪;这不像你在基本的AP数学课上得到模空间数学!(,通常情况下,推出自己的加密算法是行不通的。加密货币的问题是,如果你搞砸了,通常单元测试无法捕捉到它;有人会破解你的东西,然后你知道,这是一个很高的代价。依靠专家来构建算法,花时间确保协议的正确性(这仍然很难正确,不要掉以轻心!(。如果你坚持,请确保你有一堆明文+密钥/加密的(或明文/哈希的,或你正在做的任何事情(对进行测试,并假设你写的任何东西,即使通过了这些测试,仍然是不安全的,因为例如,使用定时攻击将密钥从算法中泄漏是微不足道的。

因为你无论如何都想在素数的模运算中使用它,就像@Progman在评论中所说的那样,你可以使用modPow()

下面是一个示例代码:

// Create BigInteger objects
BigInteger biginteger1, biginteger2, exponent, result;

//prime number
int pNumber = 5;
// Intializing all BigInteger Objects
biginteger1 = new BigInteger("23895");
biginteger2 = BigInteger.valueOf(pNumber);
exponent = new BigInteger("15");

// Perform modPow operation on the objects and exponent
result = biginteger1.modPow(exponent, biginteger2);

最新更新