OpenSSLを使用してシャミアの秘密共有を実装しようとしています。メッセージを復号化するのに多くの問題があります!
私は復号化のためにいくつかの実装を試しましたが、どちらも次のとおりです: http ://www.cs.cornell.edu/courses/cs754/2001fa/307.pdf
そしてこれは(上記の論文を参照していますが、別の方法を使用しています):
(私は計算のタイプミスを知っていることに注意してください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であるはずです。これを回避する方法はありますか?
あなたが見る私のコードに他の問題がありますか?前もって感謝します。