Shamir Secret Sharing的OpenSSL实现

时间:2012-11-02 04:59:46

标签: c openssl shared-secret

我正在尝试使用OpenSSL实现Shamir Secret Sharing。我在解密消息方面遇到了很多麻烦!

我已经尝试了几种解密实现,这两种: 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,-5,0时使用键[2,4,5]。根据我手工做的一些数学,它实际上应该是10 / 3,5和8/3。有没有办法解决这个问题?

您看到我的代码是否还有其他问题?提前谢谢。

2 个答案:

答案 0 :(得分:1)

当你执行sub,div,mul时,你需要进行模运算。即BN_mod_sub,分母上的BN_mod_inverse和BN_mod_mul。

答案 1 :(得分:1)

BN_div是一个整数除法。

对于拉格朗日,您需要进行模块化反转,然后相乘。