如何在Vigenere Cipher中维持大小写并忽略空格

时间:2019-04-08 03:47:15

标签: javascript encryption

我需要保持相同的大小写,即“攻击”将是“ 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 :(得分:0)

只需在您的字母上添加空格:

if(text.charAt(i) == ' '){
  output += " ";
}

答案 1 :(得分:0)

为了保留大小写,您必须对单个大小写进行转换。
仅在将其添加到输出时,才可以将其转换为正确的大小写。

并且为了获得与不忽略空格字符的其他算法相同的值,您必须使用第二个迭代器变量。 此迭代器仅应在有效输入上递增,并将用于迭代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;
}
<input id="inp"> <pre id="log"></pre>