JavaScript如何修改凯撒密码代码实现区分大小写加解密
凯撒密码大小写兼容改造方案
问题根因
现有实现无法保留文本大小写的核心原因有两点:
encrypt()加密函数开头强制调用toLowerCase()将所有输入转为小写,直接丢失了原始文本的大小写信息- 位移计算逻辑仅覆盖小写字母表,没有针对大写字母的分支处理,解密时也无法匹配原始大小写特征
改造逻辑
原有HTML结构、其他交互逻辑完全不需要改动,仅替换加解密函数的核心处理逻辑即可,改造遵循以下规则:
- 移除强制转小写的逻辑,逐字符遍历输入文本做单独处理
- 大写字母基于大写ASCII码区间(A-Z对应编码65-90)做位移计算,结果保留大写格式
- 小写字母基于小写ASCII码区间(a-z对应编码97-122)做位移计算,结果保留小写格式
- 数字、下划线、特殊符号等非字母字符不做任何处理,直接原样输出
- 位移量做26取模归一化,兼容位移量大于26、传入负数位移的异常场景
改造后代码
function encrypt(plainText, shift) { let result = ''; // 位移量归一化,避免异常值 const validShift = shift % 26; for (let i = 0; i < plainText.length; i++) { const currentChar = plainText[i]; // 处理大写字母 if (currentChar >= 'A' && currentChar <= 'Z') { const charCode = currentChar.charCodeAt(0); const shiftedCode = ((charCode - 65 + validShift + 26) % 26) + 65; result += String.fromCharCode(shiftedCode); } // 处理小写字母 else if (currentChar >= 'a' && currentChar <= 'z') { const charCode = currentChar.charCodeAt(0); const shiftedCode = ((charCode - 97 + validShift + 26) % 26) + 97; result += String.fromCharCode(shiftedCode); } // 非字母字符直接保留 else { result += currentChar; } } return result; } function decrypt(cipherText, shift) { // 解密本质是反向位移,直接复用加密逻辑即可 return encrypt(cipherText, -shift); }
效果验证
- 位移量设置为2,输入
Leo_123时,加密输出为Ngq_123,匹配预期 - 对上述加密结果执行解密操作,可完整还原为原始明文
Leo_123 - 数字、下划线、标点等非字母字符在加解密全程保持不变,不会被篡改
内容的提问来源于stack exchange,提问作者Atif_karim
相关产品推荐
相关产品推荐

