使用javascript

时间:2016-08-13 07:44:32

标签: javascript encryption cryptography

我正在尝试在JavaSCript中编写仿射加密算法。

首先,我已将字母插入矩阵中:

alpha =['A','B','C','Ç','D','E','Ë','F','G','H','I','J','K','L','M','N'];

字符数为90,因此该矩阵的长度为90 并且算法的模块是mod(90)。

我还使用了a = 29,因为(29,90)=1 -1 = 59。

加密功能包括3个参数:

 encrypt(a, b,word) 

并在其中我使用for()循环来循环插入单词的每个字符。

因此,for循环搜索字母矩阵中的字符,获取索引,然后使用加密函数 E(x)=(a * x + b)mod(c)。< / p>

function encrypt(a, b, word) {

    for (var i = 0; i < word.length; i++) {

        var alphaIndex = alpha.indexOf(word[i]);

        var troublesome = (a * alphaIndex + b) % alpha.length;

        word = word.substring(0, i) + alpha[troublesome] + word.substring(i + 1);
    }
    return word;
}

但是,当我应用解密时,此函数会返回一个编码字。

函数它不会返回解密的单词 D(y)= a -1 (y - b)mod(c)

解密的功能是:

function decrypt(a, b, word) {

    for (var i = 0; i < word.length; i++) {
        a %= alpha.length;

        //Bruteforce the modular invert of the a

        for (var j = 1; j < alpha.length; j++) {
            if ((a * j) % alpha.length == 1)
                var invert = j;
        }

        var alphaIndex = alpha.indexOf(word[i]);

        var troublesome = (invert * (alphaIndex - b)) % alpha.length;
        if (troublesome < 0)
            troublesome += alpha.length;
        word = word.substring(0, i) + alpha[troublesome] + word.substring(i + 1);
    }
    return word;
}

1 个答案:

答案 0 :(得分:0)

从一开始我就应该知道一个错误 当我得到a,b和单词via document.getElementbyId()时,值为 处于String状态,这就是为什么我没有得到正确的数字。

a = parseInt(a);
b = parseInt(b); 

以上两行是解决方案。

function encrypt(a, b, word) {

a = parseInt(a);
b = parseInt(b); 

    for (var i = 0; i < word.length; i++) {

        var alphaIndex = alpha.indexOf(word[i]);

        var troublesome = (a * alphaIndex + b) % alpha.length;

        word = word.substring(0, i) + alpha[troublesome] + word.substring(i + 1);
    }
    return word;
}


    function decrypt(a, b, word) {

    a = parseInt(a);
    b = parseInt(b); 

        for (var i = 0; i < word.length; i++) {
            a %= alpha.length;

            //Bruteforce the modular invert of the a

            for (var j = 1; j < alpha.length; j++) {
                if ((a * j) % alpha.length == 1)
                    var invert = j;
            }

            var alphaIndex = alpha.indexOf(word[i]);

            var troublesome = (invert * (alphaIndex - b)) % alpha.length;
            if (troublesome < 0)
                troublesome += alpha.length;
            word = word.substring(0, i) + alpha[troublesome] + word.substring(i + 1);
        }
        return word;
    }