暗号化の割り当てのために、モンゴメリの数学コードを実装しようとしています。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]の側面で軌道に乗っていない場合、誰かがそれが実際に何を意味するのか説明できますか?そして、もしそうでなければ、誰かがエラーやわずかな方向性を指摘することができますか?
これは宿題ですので、スニペット以外のコードはリストしないでください。
任意の方向性やアドバイスをいただければ幸いです。