凯撒密码是一种替换加密技术,通过将明文中的每个字符按照固定的偏移量进行移位来实现加密,解密时则反向移位即可。在JavaScript中实现凯撒密码转换,核心是利用字符的Unicode编码进行运算,同时结合数组的相关方法处理字符序列。

凯撒密码的基本原理
凯撒密码的加密规则很简单,比如设定偏移量为3,那么字符a会变成d,b会变成e,以此类推。当偏移超出字母范围时,会从另一端重新开始循环,比如z偏移3后会变成c。解密时只需要使用相反的偏移量即可还原原始内容。
在JavaScript中,每个字符都对应一个Unicode编码,我们可以通过charCodeAt方法获取字符的编码,通过String.fromCharCode方法将编码转回字符,这是实现凯撒密码的基础。
基础实现步骤
1. 字符编码转换
首先需要将明文字符串拆分为单个字符,再逐个获取对应的编码。可以使用数组的split方法拆分字符串,再使用map方法遍历处理每个字符。
2. 偏移量计算
根据设定的偏移量对字符编码进行加减操作,同时需要处理边界情况,确保偏移后仍然在目标字符的范围内,比如只处理小写字母的话,范围就是97到122。
3. 编码转回字符
处理完所有字符的编码后,将新的编码数组转回字符串,就得到了加密后的结果。
完整代码示例
以下是一个支持大小写字母的凯撒密码加密函数实现:
function caesarEncrypt(text, shift) {
// 将字符串拆分为字符数组
const charArray = text.split('');
// 遍历数组处理每个字符
const encryptedArray = charArray.map(char => {
const code = char.charCodeAt(0);
// 处理小写字母 a-z 编码范围97-122
if (code >= 97 && code <= 122) {
// 计算偏移后的编码,取模保证循环
const newCode = ((code - 97 + shift) % 26) + 97;
return String.fromCharCode(newCode);
}
// 处理大写字母 A-Z 编码范围65-90
if (code >= 65 && code <= 90) {
const newCode = ((code - 65 + shift) % 26) + 65;
return String.fromCharCode(newCode);
}
// 非字母字符直接返回
return char;
});
// 将加密后的数组转回字符串
return encryptedArray.join('');
}
// 测试加密功能
const plainText = 'Hello World';
const shiftNum = 3;
const encryptedText = caesarEncrypt(plainText, shiftNum);
console.log('加密结果:', encryptedText); // 输出 Khoor Zruog
对应的解密函数只需要将偏移量取反即可,实现如下:
function caesarDecrypt(text, shift) {
// 解密就是使用负的偏移量加密
return caesarEncrypt(text, -shift);
}
// 测试解密功能
const decryptedText = caesarDecrypt(encryptedText, shiftNum);
console.log('解密结果:', decryptedText); // 输出 Hello World
进阶优化方案
上述基础实现已经能满足大部分场景的需求,还可以做一些优化提升实用性:
- 支持自定义字符范围,比如可以加入数字或者特殊字符的偏移处理
- 增加偏移量的合法性校验,避免传入非数字类型的偏移量导致错误
- 处理负数偏移量的取模问题,确保负数的偏移也能正确循环
以下是优化后的加密函数,增加了参数校验和更完善的取模处理:
function caesarEncryptAdvanced(text, shift) {
// 校验偏移量是否为整数
if (!Number.isInteger(shift)) {
throw new Error('偏移量必须是整数');
}
const charArray = text.split('');
const encryptedArray = charArray.map(char => {
const code = char.charCodeAt(0);
if (code >= 97 && code <= 122) {
// 处理负数偏移的取模问题
const newCode = ((code - 97 + shift % 26 + 26) % 26) + 97;
return String.fromCharCode(newCode);
}
if (code >= 65 && code <= 90) {
const newCode = ((code - 65 + shift % 26 + 26) % 26) + 65;
return String.fromCharCode(newCode);
}
return char;
});
return encryptedArray.join('');
}
// 测试负数偏移
console.log(caesarEncryptAdvanced('Khoor Zruog', -3)); // 输出 Hello World
常见问题说明
在实现过程中,很多开发者会遇到取模运算的问题,比如当偏移量为负数时,直接使用%运算符得到的结果可能不符合预期,因此需要先对偏移量取26的模,再加上26再取模,确保结果始终是正数。
另外需要注意,上述实现只处理了英文字母的偏移,如果需要对中文或者其他字符进行加密,需要重新定义对应的编码范围,或者调整实现逻辑,因为中文的Unicode编码范围比较广,不适合用简单的循环偏移处理。
JavaScript凯撒密码字符编码数组操作修改时间:2026-07-04 18:45:22