1

OpenSSLBIGNUMで問題が発生しています。基本的なElGamalプロトコルを実装しようとしています。私が抱えている問題は、これらの計算のいくつかが私が期待している値を返さないことです!これは、乗法逆数を計算しようとするとほとんど明らかです。

例えば:

static void roughExample() {
BIGNUM *u1 = BN_new();
BIGNUM *u2 = BN_new();

BIGNUM *one = BN_new();
BN_one(one);
BIGNUM *negOne = BN_new();
BN_zero(negOne);
BN_sub(negOne, negOne, one); // So negOne should = -1 and it does

BN_print_fp(stdout, negOne);  //shows -1 here

BN_rand_range(u1, q); // q = large prime, point being that u1 = random large num
BN_print_fp(stdout, u1);

BN_exp(u2, u1, negOne, ctx);
BN_print_fp(stdout, u2); // in the output, u1 = u2.
}

上記の出力は、-1、[大素数]、[まったく同じ大素数]として出力されます。

したがって、明らかにBN_expは、私が期待していることを実行していません。この場合、BN_divを使用して1 / xを実行できると思いますが、欠落しているより大きな画像があるかどうか疑問に思っています。私はこのような計算をたくさん行っていますが、値が予想どおりに変更されたことを常に視覚的に確認できるとは限りません。

誰か助けてもらえますか?前もって感謝します!

編集:1 / xを使用してみましたが、値は0になります...:/

4

1 に答える 1

1

関数が必要ですBN_mod_inverse。他の関数はそのようなアルゴリズムを提供しません。

qが素数の場合、qを法として(q-2)へのべき乗を実行することもできます。そして、フェルマーの小定理により、逆フィールドメンバーが得られます。

于 2012-10-23T06:13:15.630 に答える