在JavaScript中实现凯撒密码
定义
凯撒密码是一种简单的替换密码,其中每个字母被字母表中固定数量的位置替换。例如,左移3位,D将被替换为A,E将变为B,依此类推。
实现
[!NOTE]
以下实现仅适用于拉丁字母(
A到Z和a到z),忽略所有其他字符。
根据模式(由decrypt参数决定),密码要么将shift从每个字母的字符代码中加上,要么减去,必要时绕过字母表。这是通过使用取模运算符(%)和三元运算符(?)实现的。
然后,使用扩展运算符(...)和Array.prototype.map(),算法迭代给定字符串的字母。对于每个字母,它使用String.prototype.charCodeAt()将其转换为字符代码,应用位移,然后使用String.fromCharCode()将其转换回字母。如果字符代码不在65(A)到90(Z)或97(a)到122(z)的范围内,则保持不变。
最后,使用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]
凯撒密码是最容易破解的密码之一。不要将其用于敏感数据。