You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

凯撒密码暴力破解:请求修复代码以获取唯一有效密钥

解决凯撒密码密钥重复的问题

嘿,我明白你的困扰了——你现在的代码会输出重复的密钥结果,这是因为凯撒密码的有效密钥范围其实是0到25,而你循环到52的话,密钥26就等于密钥0(毕竟26 mod 26 = 0),密钥27等于密钥1,以此类推,自然会出现重复的解密文本。

问题根源分析

你代码里对大小写字母分别处理,但不管是大写还是小写,都是基于26个英文字母的循环偏移。当密钥超过25时,(偏移量 + key) % 26的结果就会和key-26的结果完全一致,所以密钥26和0、27和1的解密结果是一模一样的。

另外还有个小问题:你的else分支没有判断字符是否是小写字母,如果密文里有空格、数字这类非字母字符,会导致错误的输出,咱也一起修复这个问题。

修正后的代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 记得给密文赋值,比如:
char cryptedText[] = "YourEncryptedTextHere"; 

int main() {
    // 只循环0到25,覆盖所有唯一密钥
    for (int key = 0; key < 26; ++key) {
        printf("密钥 %d 对应的明文:", key);
        for (int i = 0; i < strlen(cryptedText); ++i) {
            if (cryptedText[i] >= 'A' && cryptedText[i] <= 'Z') {
                printf("%c", ((cryptedText[i] - 'A' + key) % 26 + 'A'));
            } else if (cryptedText[i] >= 'a' && cryptedText[i] <= 'z') {
                printf("%c", ((cryptedText[i] - 'a' + key) % 26 + 'a'));
            } else {
                // 非字母字符直接输出,避免乱码
                printf("%c", cryptedText[i]);
            }
        }
        printf("\n");
    }
    return 0;
}

关键修改点

  • 缩小密钥范围:把循环条件从key <=52改成key <26,这样每个密钥(0-25)对应的解密结果都是唯一的,不会重复。
  • 完善字符判断:新增else if专门处理小写字母,剩下的非字母字符直接输出,避免处理错误。
  • 优化输出格式:把密钥说明放在明文前面,看起来更清晰。

这样修改后,你就能得到26个唯一的密钥对应的解密结果,不会再有重复的情况啦!

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

火山引擎 最新活动