0

暗号化の割り当てのために、モンゴメリの数学コードを実装しようとしています。BigIntegerの個々のビットを1と比較する必要があるステップを除いて、ほとんどが機能しています。

ステップ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を使用していて、それが正であることがわかっている場合は、Java 7nに変換してBitSet、「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 に答える