0

我正在尝试为加密分配实现一些蒙哥马利数学代码;除了需要将 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] 方面偏离了轨道,那么有人可以解释它的实际含义吗?如果没有,有人能指出任何错误或轻微的方向吗?

这是一项家庭作业,因此请不要列出除片段之外的任何代码。

任何方向或建议将不胜感激。

4

1 回答 1

2
for(int i = n.bitLength() - 1; i > 0 ; i--) { ... }

这将错过第 0 位(因为当i==0循环终止时。)
尝试使用>=而不是>

for(int i = n.bitLength() - 1; i >= 0 ; i--) { ... }

或者,如果您使用的是 Java 7并且您知道这n是肯定的,那么您可以将其转换为 aBitSet并遍历其 '1' 位:

static void showBitsOf(BigInteger n) {
    if (n.compareTo(BigInteger.ZERO) < 0) {
        throw new IllegalArgumentException("n must not be negative");
    }
    BitSet bs = BitSet.valueOf(n.toByteArray());
    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
        System.out.println(i);
    }
}
于 2012-11-01T11:48:36.480 回答