我正在尝试使用 OpenSSL 实现 Shamir Secret Sharing。我在解密消息时遇到了很多麻烦!
我已经尝试了几种解密实现,这两个: http ://www.cs.cornell.edu/courses/cs754/2001fa/307.pdf
而这个(参考了上面的论文,但使用了不同的方法):
(注意我知道计算的错字
u2
)
我相信我的问题可能是在使用 BIGNUM 值表示关键数字对 ik/(ik-ij) 进行拉格朗日插值时失去精度。我写了一个小函数,将一个int
like 键号转换为一个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。有没有办法解决这个问题?
您看到我的代码还有其他问题吗?提前致谢。