0

OpenSSLを使用してシャミアの秘密共有を実装しようとしています。メッセージを復号化するのに多くの問題があります!

私は復号化のためにいくつかの実装を試しましたが、どちらも次のとおりです: http ://www.cs.cornell.edu/courses/cs754/2001fa/307.pdf

そしてこれは(上記の論文を参照していますが、別の方法を使用しています):

http://i9.photobucket.com/albums/a60/cacollo/confused1.jpg(私は計算のタイプミスを知っていることに注意してくださいu2

キー番号を表すためにBIGNUM値を使用して、ik /(ik-ij)でラグランジュ補間を実行すると、精度が低下する可能性があると思います。intキー番号のようなものをBIGNUM値に変換する小さな関数を作成しました。

正しく機能していると確信しているので、キー生成コードは割愛します。以下は、私がリンクしたJPEGの実装です(PDFではありません)。

int i;
for (i = 0; i < 3; i++) {
    aij[i] = BN_new();
    BN_mod_exp(aij[i], c.c1, key[i].key, p, ctx);
}


BIGNUM *ik = BN_new();
BIGNUM *ij = BN_new();
BIGNUM *denomTmp = BN_new();
BIGNUM *numTmp = BN_new();
BIGNUM *divTmp = BN_new();
BIGNUM *accum = BN_new();

int j, k;

/* Lagrange Interpolation */
for (j = 0; j < 3; j++) {
    BN_one(accum);
    for (k = 0; k < 3; k++) {
        if(j == k) continue;
        else {
            ik = int2BN(key[k].keynum); //int2BN is my function for converting ints to BNs
            ij = int2BN(key[j].keynum);

            BN_sub(denomTmp, ik, ij);

            BN_div(divTmp, NULL, ik, denomTmp, ctx);
            BN_mul(accum, accum, divTmp, ctx);
        }
    }
    cij[j] = BN_new();
    BN_mod(cij[j], accum, q, ctx); // accum % q = cij[j]
}

// Now for the second half...
int a;
u1 = BN_new();
BIGNUM *u1tmp = BN_new();
BN_one(u1);
for (a = 0; a < 3; a++) {
    BN_mod_exp(u1tmp, aij[a], cij[a], p, ctx);
    BN_mod_mul(u1, u1, u1tmp, p, ctx);
}

cij []で計算値を吐き出すと、キー[2、4、5]を使用すると2、-5、0が得られます。私が手で行ったいくつかの数学によると、それは実際には10 / 3、5、および8/3であるはずです。これを回避する方法はありますか?

あなたが見る私のコードに他の問題がありますか?前もって感謝します。

4

2 に答える 2

2

sub、div、mulを実行するときは、モジュラー演算を実行する必要があります。つまり、分母のBN_mod_sub、BN_mod_inverse、およびBN_mod_mulです。

于 2012-11-02T08:38:43.470 に答える
1

BN_divは整数除算です。

Lagrangeの場合、モジュラー反転を実行してから乗算する必要があります。

于 2013-01-30T13:46:39.320 に答える