2012-08-23 141 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