Skip to content

在JavaScript中实现凯撒密码

定义

凯撒密码是一种简单的替换密码,其中每个字母被字母表中固定数量的位置替换。例如,左移3位,D将被替换为AE将变为B,依此类推。

实现

[!NOTE]

以下实现仅适用于拉丁字母AZaz),忽略所有其他字符。

根据模式(由decrypt参数决定),密码要么将shift从每个字母的字符代码中加上,要么减去,必要时绕过字母表。这是通过使用取模运算符(%)和三元运算符(?)实现的。

然后,使用扩展运算符(...)和Array.prototype.map(),算法迭代给定字符串的字母。对于每个字母,它使用String.prototype.charCodeAt()将其转换为字符代码应用位移,然后使用String.fromCharCode()将其转换回字母。如果字符代码不在65A)到90Z)或97a)到122z)的范围内,则保持不变。

最后,使用Array.prototype.join()将字母组合成字符串

const caesarCipher = (str, shift, decrypt = false) => {
  const s = decrypt ? (26 - shift) % 26 : shift;
  const n = s > 0 ? s : 26 + (s % 26);
  return [...str]
    .map((l, i) => {
      const c = str.charCodeAt(i);
      if (c >= 65 && c <= 90)
        return String.fromCharCode(((c - 65 + n) % 26) + 65);
      if (c >= 97 && c <= 122)
        return String.fromCharCode(((c - 97 + n) % 26) + 97);
      return l;
    })
    .join('');
};

caesarCipher('Hello World!', 23); // 'Ebiil Tloia!'
caesarCipher('Hello World!', -3); // 'Ebiil Tloia!'
caesarCipher('Ebiil Tloia!', 23, true); // 'Hello World!'
caesarCipher('Ebiil Tloia!', -3, true); // 'Hello World!'

[!CAUTION]

凯撒密码是最容易破解的密码之一。不要将其用于敏感数据。