我正在編碼一個JavaScript版本,可以解碼我在PHP中創建的RSA加密。 一切工作正常,但我沒有一個JavaScript等價於bcpowmod。JavaScript等價於bcpowmod
我使用PHP JS庫作爲其他功能,但它沒有bcpowmod。
如果我使用默認的數學運算符,如:(pow(block,q))%r我得到NAN。
有沒有一種方法或js庫可以爲我工作?
我正在編碼一個JavaScript版本,可以解碼我在PHP中創建的RSA加密。 一切工作正常,但我沒有一個JavaScript等價於bcpowmod。JavaScript等價於bcpowmod
我使用PHP JS庫作爲其他功能,但它沒有bcpowmod。
如果我使用默認的數學運算符,如:(pow(block,q))%r我得到NAN。
有沒有一種方法或js庫可以爲我工作?
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;
}
非常感謝,您的圖書館是完全我在找什麼。客戶端解密:-) – Barry127
您可以定義算法嗎?它是'f(a,b,c)= a^b mod c'嗎? –
對於什麼輸入值,你會得到NaN? –
爲了測試目的,我使用了一個128位的RSA密鑰對。這是值︰block = 680775076861010809656303294568015608270 q = 94354249269619201763195130154376477531和r = 128 – Barry127