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

JavaScript凯撒密码解密:如何逆向每两字符后插入的随机字母

代码反馈与解决方案

一、现有代码问题分析

加密函数问题

  1. 循环变量i未用let/const声明,会变为全局变量,引发后续代码冲突
  2. 插入随机字母的逻辑错误:按原消息的字符索引计数(包含非字母),而非实际处理的字母数量。若原消息含非字母字符,会导致随机字母插入时机混乱
  3. 丢失原字符大小写:原代码将所有字母转为小写,加密后无法还原原始大小写格式

解密函数核心问题

未处理加密时插入的随机字母,所有字符都被解密,导致结果完全错误;同时同样存在循环变量未声明、丢失大小写的问题


二、修正后的完整代码

const alphabet = "abcdefghijklmnopqrstuvwxyz";

function encrypt(message, shiftValue) {
    let encryptedMessage = '';
    let processedLetterCount = 0; // 仅统计已处理的明文字母数量

    for (let i = 0; i < message.length; i++) {
        const originalChar = message[i];
        const char = originalChar.toLowerCase();

        if (alphabet.includes(char)) {
            processedLetterCount++;
            const idx = alphabet.indexOf(char);
            const adjustedShift = shiftValue % alphabet.length; // 处理超大偏移值
            const newIdx = (idx + adjustedShift) % alphabet.length;
            // 保留原字符大小写
            encryptedMessage += originalChar === originalChar.toUpperCase() 
                ? alphabet[newIdx].toUpperCase() 
                : alphabet[newIdx];

            // 每处理2个明文字母后插入随机字母
            if (processedLetterCount % 2 === 0) {
                const randomIndex = Math.floor(Math.random() * 26);
                encryptedMessage += alphabet[randomIndex];
            }
        } else {
            encryptedMessage += originalChar;
        }
    }

    return encryptedMessage;
}

function decrypt(encryptedMessage, shiftValue) {
    let decryptedMessage = '';
    let restoredLetterCount = 0; // 统计已还原的明文字母数量

    for (let i = 0; i < encryptedMessage.length; i++) {
        const originalChar = encryptedMessage[i];
        const char = originalChar.toLowerCase();

        if (alphabet.includes(char)) {
            restoredLetterCount++;
            const idx = alphabet.indexOf(char);
            const adjustedShift = shiftValue % alphabet.length;
            // 确保索引为正
            const newIdx = (idx - adjustedShift + alphabet.length) % alphabet.length;
            // 保留原字符大小写
            decryptedMessage += originalChar === originalChar.toUpperCase() 
                ? alphabet[newIdx].toUpperCase() 
                : alphabet[newIdx];

            // 每还原2个字母,跳过下一个随机插入的字符
            if (restoredLetterCount % 2 === 0) {
                i++;
            }
        } else {
            decryptedMessage += originalChar;
        }
    }

    return decryptedMessage;
}

三、代码修正说明

加密函数

  1. 新增processedLetterCount变量,仅统计实际处理的字母,确保随机字母插入时机准确
  2. 用let声明循环变量,避免全局污染
  3. 保留原字符大小写,还原加密前的格式
  4. 对偏移值取模,处理超大偏移值的冗余计算

解密函数

  1. 新增restoredLetterCount变量,统计已还原的字母,每还原2个就跳过下一个随机插入的字符
  2. 同步修复循环变量声明、大小写保留问题,确保解密逻辑与加密完全逆向

四、指定秘密消息解密结果

偏移值42等效于42 % 26 = 16,解密后明文为:

Welcome to the wonderful world of Stack Overflow where folks. I Hope, reading this post brings 'happiness' and helps you grow. Stay curious and keep learning even when things seem confusing or hard at first glance.


新手提示

拼凑代码绝非作弊——编程学习的核心就是参考、模仿、拆解、重构的过程,关键是逐步理解每段代码的逻辑,积累自己的知识体系。

内容的提问来源于stack exchange,提问作者Owen Miller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:31