You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.04 16:15:42