我正在尝试在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;
}
答案 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;
}