Как сохранить регистр и игнорировать пробелы в Vigenere Cipher - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно иметь возможность сохранить тот же случай, то есть «Атака» будет «Lxfopv», с ключом «лимон».Кроме того, мне нужно сохранить все пробелы в сообщении для шифрования.

Я использовал оператор if для проверки пробелов

    if(text.charAt(i) == ' '){
      continue;

, но он, похоже, ничего не делает.

function encrypt(text, key) {
  var output= '';
  var alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  for(var i = 0; i < text.length; i++){
    var a= alphabet.indexOf(key.charAt(i % key.length));
    var b= alphabet.indexOf(text.charAt(i));
    if(text.charAt(i) == ' '){
      continue;
    }else{
      output += alphabet.charAt((a+ b) % alphabet.length);

    }
  }
  return output;
}

Если передать в «Атака на рассвете», мой желаемый результат должен быть Lxfopv ef Rnhr, но я получаю LxFopvmHOeIB с ключом «лимон».

Как я могу исправитьэто чтобы получить желаемый результат?Это как-то связано с тем, что я жестко закодировал свой алфавит?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Чтобы сохранить дело, вам нужно будет выполнить преобразование в одном случае.
Только в момент добавления его к вашему выводу вы преобразуете его в правильный регистр.

И чтобы получить то же значение, что и другие алгоритмы, которые игнорируют символ пробела, вы должны использовать вторую переменную итератора. Этот итератор должен увеличиваться только на допустимых входных данных и будет использоваться для итерации key.

inp.oninput = e => log.textContent = encrypt(inp.value, 'lemon');

function encrypt(text, key) {
  var output= '';
  // single case dictionary
  var alphabet = "abcdefghijklmnopqrstuvwxyz";
  var low = text.toLowerCase(); // we'll work on this one

  for(let i = 0, j = 0; i < text.length; i++){
    // here we use `j` for the key
    let a = alphabet.indexOf(key.charAt(j % key.length));
    let b = alphabet.indexOf(low.charAt(i));
    let out = ''; // the character we'll add
    if(low.charAt(i) == ' '){
      out = ' '; // keep spaces untouched
    }else if(b > -1){ // only if valid
      out = alphabet.charAt((a+ b) % alphabet.length); // get the ciphered value
      j++; // only here we increment `j`
    }
    if(low[i] !== text[i]) { // if input and lower case are different
      // that means that input was upper case
      out = out.toUpperCase();
    }
    output += out; 
  }
  return output;
}
 
0 голосов
/ 08 апреля 2019

Просто добавьте пробел к вашему алфавиту:

if(text.charAt(i) == ' '){
  output += " ";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...