我正在编写一个可以解码我用 PHP 制作的 RSA 加密的 javascript 版本。一切正常,除了我没有与 bcpowmod 等效的 javascript。
我将 PHP JS 库用于其他功能,但它没有 bcpowmod。
如果我使用默认的数学运算符,例如: (pow(block,q)) % r 我会得到 NAN。
有没有适合我的方法或 js 库?
我正在编写一个可以解码我用 PHP 制作的 RSA 加密的 javascript 版本。一切正常,除了我没有与 bcpowmod 等效的 javascript。
我将 PHP JS 库用于其他功能,但它没有 bcpowmod。
如果我使用默认的数学运算符,例如: (pow(block,q)) % r 我会得到 NAN。
有没有适合我的方法或 js 库?
bcpowmod 在 javascript 中非常困难。这是执行此操作的代码。我刚刚发布了一个完整的库供任何人在他们的网站中使用 RSA RC4 加密,但很快就被版主 Brad Larson 击落了。他说,Stack Overflow 不想要这种东西。无论如何,这是给你的代码。
Java 脚本在这方面很慢。所以我分多个步骤来做,这样 javascript 就有时间显示进度条或其他东西。我必须编写自己的 bcmath 包才能做到这一点。您可以在http://jerrywickey.com/test/testJerrysLibrary.php看到整个加密函数库
您需要任意精度的乘法、除法、减法和比较。所以他们都在这里。实际的 bcpowmod 分多个步骤完成,因为它只需要很长时间。
计算完成后,它会使用结果调用回调参数中指定的函数。来回交换 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;
}