JavaScript 中的 Vigenère 密码显示或 � 字符

Vigenère cipher in JavaScript showing or � characters

我在 JavaScript 中制作了维吉尼亚密码。

如果我 运行 我在 Firefox 中的代码我得到以下输出:

�QZ4Sm0]米

在GoogleChrome中看起来像这样

QZ4Sm0]米

如何避免这些符号或如何使它们可见? 我做错了什么?

function vigenere(key, str, mode) {
  var output = [str.length];
  var result = 0;
  var output_str;

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

    if (mode == 1) {
      result = ((str.charCodeAt(i) + key.charCodeAt(i % key.length)) % 128);
      output[i] = String.fromCharCode(result);
    } else if (mode == 0) {
      if (str.charCodeAt(i) - key.charCodeAt(i % key.length) < 0) {
        result = (str.charCodeAt(i) - key.charCodeAt(i % key.length)) + 128;
      } else {
        result = (str.charCodeAt(i) - key.charCodeAt(i % key.length)) % 128;
      }
      output[i] = String.fromCharCode(result);
    }

  }
  output_str = output.join('');
  return output_str;
}

console.log(vigenere("Key", "Plaintext", 1))

你的第一个计算在所有浏览器中给出了一个 esc (#27)。在 Firefox 中可见,但在 Chrome

中不可见

这个给 Zpysrrobr:https://www.nayuki.io/page/vigenere-cipher-javascript

function vigenere(key, str, mode) {
  var output = [str.length];
  var result = 0;
  var output_str;

  for (var i = 0; i < str.length; i++) {
    if (mode == 1) {
      result = ((str.charCodeAt(i) + key.charCodeAt(i % key.length)) % 128);
      output[i] = String.fromCharCode(result);
      console.log( 
      str[i],key[i],result,output[i])

    } else if (mode == 0) {
      if (str.charCodeAt(i) - key.charCodeAt(i % key.length) < 0) {
        result = (str.charCodeAt(i) - key.charCodeAt(i % key.length)) + 128;
      } else {
        result = (str.charCodeAt(i) - key.charCodeAt(i % key.length)) % 128;
      }
      output[i] = String.fromCharCode(result);
    }

  }
  output_str = output.join('');
  return output_str;
}

console.log(vigenere("Key", "Plaintext", 1))

尝试使用这段代码。它更简单且可读性强

function vigenereFunc(plainText, key) {
   const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   let cipherText = "";
   for (let i = 0, j = 0; i < plainText.length; i++) {
     if (!letters.includes(plainText[i])) {
       cipherText += plainText[i];
          continue;
     }
     cipherText += letters[(letters.indexOf(plainText[i]) + letters.indexOf(key[j])) % 26];

     if(j === key.length - 1) j = -1;
     return cipherText;
  }