2

いくつかの暗号コードをJavaからVisualC++に移植する必要がありますが、これは(Visual C ++)私にはあまり馴染みがありません。http://sourceforge.net/projects/cpp-bigint/で、大きな整数に使用できるライブラリを見つけました。

ただし、javasSecureRandomクラスに相当するものはありません。c ++でbeecryptというプロジェクトを見つけましたが、VisualStudio2008で動作させることができませんでした。

これらのタイプのライブラリの経験はありますか?私もgmpを見ましたが、VisualStudioで動作するものをすぐに見つけることができませんでした。

間違った道を進む前に何かアドバイスはありますか?

ありがとう!

- - アップデート - - - -

上からcpp-bigintを使用して、少数の概念実証を行っているようです。ライブラリにはmodPow関数はありません。今のところ、次のようなforループを作成しました。

for(RossiBigInt i("0",DEC_DIGIT); i< r; i++)

{x = x * g; x = x%p; }

これにより、x = g ^ r mod pが得られますが、非常に低速です。modPow関数を備えた他のBitIntegerライブラリを知っている人、またはこれを計算するためのより高速な方法を知っている人はいますか?

ありがとう!

4

2 に答える 2

2

modPow関数は、「2乗および乗算」アルゴリズムを使用して効率的に評価できます。Javaでは、次のようになります(JavaのBigIntegerにまだ含まれていない場合)。

/* Compute x^n mod m. */
static BigInteger modPow(BigInteger x, BigInteger n, BigInteger m)
{
    if (n.signum() < 0)
        throw new IllegalArgumentException("bwah, negative exponent");
    BigInteger r = BigInteger.ONE;
    for (int i = n.bitLength() - 1; i >= 0; i --) {
        if (n.testBit(i))
            r = r.multiply(x).mod(m);
        if (i > 0)
            r = r.multiply(r).mod(m);
    }
    return r;
}

これにより、ループの反復回数は指数の長さ(ビット単位)に等しくなるため、計算時間は許容範囲内になります。

反復ごとに1つまたは2つのモジュラー削減が得られるため、これはこれまでで最速のべき乗アルゴリズムにはなりません(モジュラー削減は乗算よりも大幅にコストがかかります)。典型的なmodPow()の実装では、モンゴメリリダクションを使用します。これは、すべてのモジュラーリダクションを最後に1つの同様の操作にマージする巧妙なトリックです。

時間があれば、独自のべき乗剰余を実装することは非常に教育的です。このサイトから無料でダウンロードできる「応用暗号化ハンドブック」の第14章を読むことから始めます。ただし、予算を日常的に考慮することで創造性と自由時間が制限されることが多いこの過酷な世界では、すでに実装されているライブラリに満足しているでしょう。GMPは非常に優れていることが知られていますが、Windowsでの使用はやや困難です。あなたはNTLでより幸運があるかもしれません。

于 2010-03-04T22:48:09.197 に答える
0

Windowsでランダムデータを生成するために、CryptoAPI、特にCryptGenRandomメソッドを使用することもできます。

于 2010-03-04T05:52:48.823 に答える