Почему я получаю случайные неопределенные символы в выводе дешифрования в моем алгоритме шифрования Виженера?

Я работаю над своим собственным шифром Виженера в JavaScript. Мне нравится это. В любом случае, шифрование и дешифрование одинаковы, за исключением того, что decrypt() имеет значение '-' keyStr вместо '+' внизу. Шифрование работает идеально. Но по какой-то причине при расшифровке некоторые символы случайным образом выходят как undefined. Я знаю, что алгоритм работает для C++, Python, Java и Swift. В чем здесь ошибка?

Я попытался напечатать индексы символов в массиве алфавита, и значения индексов в decrypt() оказались странными, и я не могу понять, почему.

function ascii(x) {
return x.charCodeAt(0);
}

function decrypt() {
var alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var msgStr = "";
var keyTemp = "";
var keyStr = "";
var output = "";
var input = document.getElementById("inMsg").value;
var key = document.getElementById("key").value;

input = input.toUpperCase();
key = key.toUpperCase();

for(let i = 0; i < input.length; i++) {
    for(let x = 0; x < alpha.length; x++) {
        if (input[i] == alpha[x]) {
            msgStr += alpha[x];
        }
    }
}

for(let i = 0; i < msgStr.length; i++) {
    keyTemp += key[i % key.length]
}

for(let i = 0; i < keyTemp.length; i++) {
    for(let x = 0; x < alpha.length; x++) {
        if (keyTemp[i] == alpha[x]) {
            keyStr += alpha[x];
        }
    }
}

for(let i = 0; i < msgStr.length; i++) {
    let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;
    output += alpha[x];
}

document.getElementById("outMsg").value = output;
}

person Timothy Waters    schedule 30.12.2018    source источник
comment
Не могли бы вы опубликовать ссылку на рабочие алгоритмы на других языках, пожалуйста? Возможно у вас ошибка перевода.   -  person Jack Bashford    schedule 30.12.2018
comment
Как сказал DoughnutDayDevotee, % не является настоящим оператором модуля.   -  person Timothy Waters    schedule 31.12.2018


Ответы (1)


Проблема, с которой вы столкнулись, вызвана этой строкой:

let x = (ascii(msgStr[i]) - ascii(keyStr[i])) % 26;

потому что

ascii(msgStr[i]) - ascii(keyStr[i])

может быть отрицательным.

Оператор % на самом деле не является оператором модуля в javascript, это оператор остатка, и он работает немного по-другому.

Из приведенной выше ссылки вы сможете сделать что-то подобное, чтобы заставить его работать:

 let x = ((ascii(msgStr[i]) - ascii(keyStr[i])) % 26) + 26) % 26
person DoughnutDayDevotee    schedule 30.12.2018
comment
Спасибо! Это сработало! Я понятия не имел, что % не был настоящим оператором модуля. Есть ли реальный оператор модуля в JavaScript? - person Timothy Waters; 30.12.2018