JavaScript凯撒密码解密:如何逆向每两字符后插入的随机字母
代码反馈与解决方案
一、现有代码问题分析
加密函数问题
- 循环变量
i未用let/const声明,会变为全局变量,引发后续代码冲突 - 插入随机字母的逻辑错误:按原消息的字符索引计数(包含非字母),而非实际处理的字母数量。若原消息含非字母字符,会导致随机字母插入时机混乱
- 丢失原字符大小写:原代码将所有字母转为小写,加密后无法还原原始大小写格式
解密函数核心问题
未处理加密时插入的随机字母,所有字符都被解密,导致结果完全错误;同时同样存在循环变量未声明、丢失大小写的问题
二、修正后的完整代码
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; }
三、代码修正说明
加密函数
- 新增
processedLetterCount变量,仅统计实际处理的字母,确保随机字母插入时机准确 - 用
let声明循环变量,避免全局污染 - 保留原字符大小写,还原加密前的格式
- 对偏移值取模,处理超大偏移值的冗余计算
解密函数
- 新增
restoredLetterCount变量,统计已还原的字母,每还原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
相关产品推荐
相关产品推荐

