javascript-эквивалент bcpowmod

Я кодирую версию JavaScript, которая может декодировать шифрование RSA, которое я сделал в PHP. все работает отлично, за исключением того, что у меня нет javascript-эквивалента bcpowmod.

Я использовал библиотеку PHP JS для других функций, но в ней нет bcpowmod.

Если я использую математические операторы по умолчанию, такие как: (pow(block,q)) % r, я получаю NAN.

Есть ли способ или библиотека JS, которая может работать для меня?

1 ответ

Решение

bcpowmod очень жесток в javascript. Вот код, чтобы сделать это. Я только что опубликовал целую библиотеку, чтобы каждый мог использовать шифрование RSA RC4 на своих веб-сайтах, но был быстро сбит модератором Брэдом Ларсоном. Он сказал, что они не хотят такого рода вещей в 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;
    }
Другие вопросы по тегам