我正在尝试为加密分配实现一些蒙哥马利数学代码;除了需要将 BigInteger 中的每个单独的位与 One 进行比较的步骤之外,我的大部分工作都在工作。
我从第 4 步开始使用的数学算法是
for i = k - 1 down to 0 do
xBar = MonPro(xBar, xBar)
if e[i] = 1 then xBar = MonPro(MBar, xBar)
i 只是一个索引,k 是 BIgInteger 中的位数,b 是指数。我的尝试是:
for(int i = n.bitLength() - 1; i > 0 ; i--) {
xBar = monPro(xBar, xBar, r, nPrime, n);
if (n.testBit(i) == true)
xBar = monPro(mBar, xBar, r, nPrime, n);
}
return monPro(xBar, BigINteger.ONE, r, nPrime, n);
monPro 是一个绝对有效的辅助函数。同样,在该代码片段之前省略的步骤肯定有效。所以主要问题是,我如何按位迭代 BigInteger?除非我对 e[i] 有误,请参见下文。
在过去的一段时间里,我已经对此进行了大量的阅读,而关于实际实现的资源很少。一些关于这个主题的数学论文纯粹是神秘的。
我也不确定是上面的 e[i] 。在书中,它是e,它的下面有一个小i,同样的方式Log2通常将2写成它下面的一个小数字。谁能澄清一下?
我已经尝试将 BigInteger 转换为以 2 为基数的字符串,并从中制作一个 char 数组并与 1 进行比较。我还尝试了 BigInteger.toString(2) 来制作一个以 2 为基数的字符串,并使用 charAt[i] == 1 循环遍历该字符串。
我确信 e[i] 上面的所有步骤都是正确的,因为我已经用很多不同的值检查了它们。
如果我在 E[i] 方面偏离了轨道,那么有人可以解释它的实际含义吗?如果没有,有人能指出任何错误或轻微的方向吗?
这是一项家庭作业,因此请不要列出除片段之外的任何代码。
任何方向或建议将不胜感激。