在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]
凯撒密码是最容易破解的密码之一。不要将其用于敏感数据。