Shamir Secret Sharing:我无法在javascript中获得正确的重建值

时间:2016-06-14 16:28:35

标签: javascript shared-secret

我尝试使用shamir秘密共享。我实现了在维基百科中找到的代码。但是当我运行它时,重建的结果与真正的秘密值不同。

https://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing

重建功能是:

function join(shares) {
    var accum, count, formula, startposition, nextposition, value, numerator, denominator;
    for(formula = accum = 0; formula < shares.length; formula++) {
    for(count = 0, numerator = denominator = 1; count < shares.length; count++) {
        if(formula == count) continue; // If not the same value
        startposition = shares[formula][0];
        nextposition = shares[count][0];
        numerator = (numerator * -nextposition) % prime;
        denominator = (denominator * (startposition - nextposition)) % prime;
    }
    value = shares[formula][1];
    accum = (prime + accum + (value * numerator * modInverse(denominator))) % prime;
}
return accum;
}

var sh = split(9846513, 5, 3)
var newshares = [sh[1], sh[3], sh[4]]; 

document.write(join(newshares));

</script>

当我尝试运行此代码时,结果为9846513,而不是761。 有人可以帮我解决这个逻辑错误吗?

1 个答案:

答案 0 :(得分:0)

根据公式,您尝试重建的数字必须小于算法中使用的素数。

您必须使用大于9846513的素数...下一个最大素数是9846517

var prime = 9846517;
...
var sh = split(9846513, 5, 3)
var newshares = [sh[1], sh[3], sh[4]]; 
document.write(join(newshares));

这里小提琴: https://jsfiddle.net/brettwgreen/gz84bw83/