From: Stephan Richter <github@keawe.de> Date: Fri, 13 Oct 2017 13:08:55 +0000 (+0200) Subject: Javascript-Code überarbeitet. Scheint jetzt zu funktionieren. X-Git-Url: https://fpunktk.de/gitweb/?a=commitdiff_plain;h=bdb65f4e5b44533402087235cb98b30524f2dac5;p=shamirs_secret_web_implementation.git Javascript-Code überarbeitet. Scheint jetzt zu funktionieren. --- diff --git a/src/secret.html b/src/secret.html index dd2a677..324cf45 100644 --- a/src/secret.html +++ b/src/secret.html @@ -80,35 +80,27 @@ function split(number, number_of_shares, needed) { return shares; } -function share(index,string){ - this.index=index; - this.codes=string.split(' '); - this.codeCount=function(){return this.codes.length}; - this.code=function(i){return this.codes[i];}; - this.pick=function(i){return [this.index,this.codes[i]]}; - this.string=function(){ - return 'Share '+this.index+': '+this.codes.join(' / '); - }; -} - function collect(){ var divs=document.getElementsByClassName('share'); - var shares=[],lastValue,div,inputs,num; - for (i=0; i<divs.length; i++){ - div=divs[i]; - inputs = div.getElementsByTagName('input'); - num=0; + var shares=[],lastValue; + for (var div_index=0; div_index<divs.length; div_index++){ + var div=divs[div_index]; + var inputs = div.getElementsByTagName('input'); + var share_number=0; for (var j=0; j<inputs.length;j++){ var input = inputs[j]; if (input.className == 'num') { - num=input.value; + share_number=input.value; } else { - lastValue=input.value; - if (num>0 && lastValue!='') shares[i]=new share(num,lastValue); + string=input.value; + if (share_number>0 && string!='') { + var parts = string.split(' '); + shares[div_index] = { share_number, parts }; + } } } - } - if (lastValue!=''){ + } + if (string!=''){ var clone=div.cloneNode(true); var inputs=clone.getElementsByTagName('input'); for (var j=0; j<inputs.length; j++) inputs[j].value=''; @@ -132,36 +124,50 @@ function modInverse(k) { } 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; + var sum = 0; + + for(j = 0; j < shares.length; j++) { + var numerator = 1; + var denominator = 1; + for(m = 0; m < shares.length; m++) { + if(j == m) continue; // If not the same value + numerator = (numerator * shares[m].share_number) % prime; + denominator = (denominator * (shares[m].share_number - shares[j].share_number)) % prime; } - value = shares[formula][1]; - accum = (prime + accum + (value * numerator * modInverse(denominator))) % prime; + sum = (prime + sum + (shares[j].share * numerator * modInverse(denominator))) % prime; } - return accum; + + return sum; } function decode(){ - var shares=collect(); // fetch shares + var shares_list=collect(); // fetch shares var codeCount=null; - for (var i=0; i<shares.length; i++) codeCount=(codeCount==null)?shares[i].codeCount():Math.min(shares[i].codeCount(),codeCount); + for (var i=0; i<shares_list.length; i++) { + if (codeCount == null){ + codeCount = shares_list[i].parts.length; + } else { + codeCount=Math.min(shares_list[i].parts.length,codeCount); + } + } + var ascii=document.getElementById('ascii'); ascii.innerHTML='ascii: '; result.innerHTML='Passphrase: '; - for (codeIndex=0; codeIndex<codeCount; codeIndex++){ - var shareSet=[]; - for (var i=0; i<shares.length; i++){ - shareSet[i]=shares[i].pick(codeIndex); + + + for (var codeIndex = 0; codeIndex<codeCount; codeIndex++){ + shares_for_code = []; + for (var share_index=0; share_index<shares_list.length; share_index++){ + var share_number = shares_list[share_index].share_number; + var share = shares_list[share_index].parts[codeIndex]; + shares_for_code[share_index] = { share_number, share }; } - var r=join(shareSet); - ascii.innerHTML += r+' '; - result.innerHTML+= String.fromCharCode(r); + + var code = join(shares_for_code); + ascii.innerHTML += code+' '; + result.innerHTML+= String.fromCharCode(code); + } }