2012-08-23 86 views
2

我正在编码一个JavaScript版本,可以解码我在PHP中创建的RSA加密。 一切工作正常,但我没有一个JavaScript等价于bcpowmod。JavaScript等价于bcpowmod

我使用PHP JS库作为其他功能,但它没有bcpowmod。

如果我使用默认的数学运算符,如:(pow(block,q))%r我得到NAN。

有没有一种方法或js库可以为我工作?

+0

您可以定义算法吗?它是'f(a,b,c)= a^b mod c'吗? –

+0

对于什么输入值,你会得到NaN? –

+0

为了测试目的,我使用了一个128位的RSA密钥对。这是值︰block = 680775076861010809656303294568015608270 q = 94354249269619201763195130154376477531和r = 128 – Barry127

回答

1

bcpowmod在javascript中非常凝固。这是执行它的代码。我刚刚发布了一个供任何人使用的整个库,以在他们的网站中使用RSA RC4加密,但是由主持人Brad Larson迅速击落。他说,他们不希望堆栈溢出这种东西。无论如何,这里是你的代码。

Java脚本很慢。所以我在多个步骤中这样做,所以JavaScript有时间来显示进度条或其他东西。我不得不写我自己的bcmath包来完成它。您可以看到整个加密函数库已准备好进入http://jerrywickey.com/test/testJerrysLibrary.php

您需要任意精度乘法,除法,减法和比较。所以他们都在这里。实际的bcpowmod由多个步骤完成,因为它只需要很长时间。

计算完成后,它将调用callback参数中指定的函数和结果。交换a和b来让它为你工作,只是因为我们使用不同的术语来表达RSA的公共,私人和模数值。回调函数只使用字母数字名称。不要使用括号。

bcpowmod('plain text', RSAp, RSAq, 'myCallBackForResult'); 

    function myCallBackForResult(result){ 
      alert (result + ' of powmod'); 
    } 

    function bcpowmod(str, a, b, callback){ 
     RSAencryptStep((''+str), (''+a), (''+b), '1', callback, 0); 
    } 

    function RSAencryptStep(str, a, b, result, callback, count){ 
     count++; 
     if (JL_bccomp(JL_bcmod(a, '2'), '1')==0) { 
      result = JL_bcmod(JL_bcmul(result, str), b); 
     } 
     str= JL_bcmod(JL_bcmul(str, str), b); 
     a= JL_bcdiv(a, '2'); 
     if (JL_bccomp(a, '0')!=0){ 
      var e= "RSAencryptStep('" +str+"','" +a+"','" +b+"','" +result+"','" +callback +"'," +count+")"; 
      setTimeout(e, 10); 
      clearTimeout(JL_crytime); 
      try{ 
       ge('cryptocount').innerHTML= (60 - count); 
      }catch(e){} 
     }else{ 
      eval(callback+'("'+ result+'")'); 
     } 
    } 

    function JL_bccomp(a, b){ 
     if (a.length > b.length){ return 1; } 
     if (a.length < b.length){ return -1; } 
     var i= 0; while (a.charAt(i)==b.charAt(i) && ++i<a.length){ } 
     if (i==a.length){ return 0; } 
     if (parseInt(a.charAt(i)) > parseInt(b.charAt(i))){ return 1; } 
     return -1;  
    } 

    function JL_bcadd(a, b){ 
     var zero= '00000000000000000000'; while (zero.length < a.length + b.length){ zero+= ''+zero; } 
     if (a.length < b.length){ a= ''+ zero.substring(0, (b.length - a.length)) + a; } 
     if (b.length < a.length){ b= ''+ zero.substring(0, (a.length - b.length)) + b; } 
     var s= ('0'+a).split(''); 
     var t= 0; 
     for (var i=0; i<a.length; i++){ 
      t= parseInt(s[s.length-i-1]) + parseInt(b.charAt(b.length-i-1));; 
      if (t > 9){ 
       s[s.length-i-1]= t - 10; 
       s[s.length-i-2]= parseInt(s[s.length-i-2]) + 1; 
      }else{ 
       s[s.length-i-1]= t; 
      }  
     } 
     return trim(trim((s.join('')+' '), '0'), ''); 
    } 

    function JL_bcsub(a, b){ 
     var x= JL_bccomp(a, b); 
     if (x==0){ 
      return '0'; 
     } 
     var minus= ''; 
     if (x < 0){ 
      var x= a; 
      a= b; 
      b= x; 
      minus= '-'; 
     } 
     var s= a.split(''); 
     var t= 0; 
     for (var i=0; i<s.length; i++){ 
      t= parseInt(s[s.length-i-1]); 
      if (i<b.length){ t= t - parseInt(b.charAt(b.length-i-1)); } 
      if (t<0){ 
       s[s.length-i-1]= t + 10; 
       s[s.length-i-2]= s[s.length-i-2] - 1; 
      }else{ 
       s[s.length-i-1]= parseInt(t); 
      }  
     } 
     return minus + trim(trim((s.join('')+' '), '0'), ''); 
    } 

    function JL_bcmul(a, b){ 
     var s= []; 
     for (var i=0; i < a.length + b.length; i++){ s[i]= 0; } 
     var t= 0; 
     for (i=0; i<b.length; i++){ 
      for (var j=0; j<a.length; j++){ 
       t= s[i+j] + (parseInt(a.charAt(a.length - j - 1)) * parseInt(b.charAt(b.length - i - 1))); 
       s[i+j]= t % 10; 
       s[i+j+1]= s[i+j+1] + Math.floor(t/10); 
      } 
     } 
     s.reverse(); 
     return trim(trim((s.join('')+' '), '0'), ''); 
    } 

    function JL_bcdiv(a, b){ 
     var r= '0'; 
     var rr= '1'; 
     var e= b; 
     var rrs= []; 
     var es= []; 
     var i= 0; 
     while(JL_bccomp(a, b) >= 0){ 
      rr= '1'; 
      e= b; 
      i= 0; 
      while(JL_bccomp(a, e) >= 0){ 
       a= JL_bcsub(a, e); 
       r= JL_bcadd(r, rr); 
       if (typeof es[i] == 'undefined'){ 
        es[i]= JL_bcmul(e, '2'); 
        rrs[i]= JL_bcmul(rr, '2'); 
       } 
       e= es[i]; 
       rr= rrs[i]; 
       i++; 
      } 
     } 
     // a is the remainder 
     return r; 
    } 

    function JL_bcmod(a, m){ 
     var s= []; 
     var e= m; 
     var i= 0; 
     while(JL_bccomp(a, m) >= 0){ 
      e= m; 
      i= 0; 
      while(JL_bccomp(a, e) >= 0){ 
       a= JL_bcsub(a, e); 
       if (typeof s[i] == 'undefined'){ 
        s[i]= JL_bcmul(e, '2'); 
       } 
       e= s[i]; 
       i++; 
      } 
     } 
     return a; 
    } 
+0

非常感谢,您的图书馆是完全我在找什么。客户端解密:-) – Barry127