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

Java中用shiftAlphabet实现凯撒密码加密出错,求技术支持

你的加密程序问题修复方案

我仔细看了你的代码和问题描述,发现核心问题出在凯撒加密的实现逻辑上——你当前的caesarify方法只是生成了移位后的字母表,但完全没有用这个字母表去处理输入的加密文本,这就是为什么你得到的是BCDEFGHIJKLMNOPQRSTUVWXYZA(+1移位的字母表),而不是预期的加密结果。

一、核心问题定位

你的shiftAlphabet方法其实是正确的,它能生成符合要求的移位字母表,但caesarify方法直接返回了这个字母表,跳过了“用字母表替换原文本每个字符”的关键加密步骤。

举个例子:当输入HOBEOBISTHOBEMOBAN和移位密钥1时,你需要把每个字符对应到移位字母表的对应位置——原字符H对应标准字母表的第7位(A为0),移位后字母表的第7位是I;原字符O对应第14位,移位后是P……以此类推才能得到预期的IPCFPCJTUIPCFNPCBO。

二、修复后的完整代码

我帮你修正了核心逻辑,同时优化了一些细节(比如减少重复资源创建、提升字符串拼接效率):

import java.util.Scanner;

public class ProjectCrypto {
    static String normalizedText;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 只创建一次Scanner,避免资源浪费

        System.out.println("Write a text to be encrypted below");
        normalizedText = normalizeText(scanner.nextLine());
        System.out.println("Normalized text: " + normalizedText);

        String obifiedText = Obify();
        System.out.println("Obified text: " + obifiedText);

        System.out.print("Enter shift: ");
        int key = scanner.nextInt();

        String encryptedText = caesarify(obifiedText, key);
        System.out.println("Encrypted text: " + encryptedText);

        scanner.close(); // 关闭Scanner释放资源
    }

    public static String normalizeText(String inputText){
        // 移除非字母字符并转大写
        return inputText.replaceAll("[^A-Za-z]+", "").toUpperCase();
    }

    public static String Obify(){
        StringBuilder obifiedText = new StringBuilder(); // 用StringBuilder比+=更高效
        int length = normalizedText.length();
        for (int i = 0; i < length; i++) {
            char c = normalizedText.charAt(i);
            // 判断是否为元音字母
            if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
                obifiedText.append("OB").append(c);
            } else {
                obifiedText.append(c);
            }
        }
        return obifiedText.toString();
    }

    public static String caesarify(String text, int key) {
        String shiftAlphabet = shiftAlphabet(key);
        StringBuilder encrypted = new StringBuilder();

        for (char c : text.toCharArray()) {
            // 计算原字符在标准字母表中的索引(A对应0,B对应1...)
            int originalIndex = c - 'A';
            // 用移位字母表替换对应索引的字符
            encrypted.append(shiftAlphabet.charAt(originalIndex));
        }
        return encrypted.toString();
    }

    public static String shiftAlphabet(int shift) {
        int start = 0;
        if (shift < 0) {
            start = (int) 'Z' + shift + 1;
        } else {
            start = 'A' + shift;
        }
        StringBuilder result = new StringBuilder();
        char currChar = (char) start;
        for (; currChar <= 'Z'; ++currChar) {
            result.append(currChar);
        }
        if (result.length() < 26) {
            for (currChar = 'A'; result.length() < 26; ++currChar) {
                result.append(currChar);
            }
        }
        return result.toString();
    }
}

三、关键修改说明

  1. 修复caesarify核心逻辑:

    • 遍历输入文本的每个字符,通过c - 'A'计算它在标准字母表中的索引;
    • 用shiftAlphabet生成的移位字母表,取出对应索引的字符,拼接成最终加密字符串。
  2. 细节优化:

    • 只创建一次Scanner对象,避免重复创建导致的资源冗余;
    • 用StringBuilder替代字符串+=拼接,大幅提升长文本处理的性能;
    • 调整normalizeText为接收参数的形式,减少静态变量依赖,代码更健壮。

测试验证

当你输入HEREISTHEMAN时:

  1. 归一化后得到HEREISTHEMAN;
  2. Obify处理后得到HOBEOBISTHOBEMOBAN;
  3. 输入移位密钥1,凯撒加密后会输出预期的IPCFPCJTUIPCFNPCBO。

内容的提问来源于stack exchange,提问作者Amasiatu Valentine Chidozie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:41