加密 Java 中的一段文本

Encrypt a Paragraph of Text in Java

我正在尝试制作一个游戏,其中一段文本使用简单的替换密码“加密”,例如,所有 A 都将是 F,B 将是 G,依此类推。 这个想法是 user/player 将需要通过尝试解密字母来尝试猜测名言。所以屏幕向他们显示了一个空白 space 和一个字母 A,他们必须弄清楚它实际上是一个 F 在字符串中的位置。 我还没走多远,基本上我可以使用 for 循环手动更改每个字母,但必须有更简单的方法。

import java.util.Scanner;
import java.util.Random;

public class cryptogram {
    

    public static void main(String[] args) {
        
        char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        
        for (char i = 0; i <alphabet.length; i++) {
            if (alphabet[i] == 'B') {
                    alphabet[i] = 'Z';
            }
        }
        System.out.println(alphabet);
    }
}

换人

“替代”工作流程可能类似于...

public class Main {

    public static void main(String[] args) {
        new Main().substitution();
    }
    
    public void substitution() {
        char[] lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".toCharArray();
        char[] substitution = " FGHIJKLMNOPQRSTUVWXYZABCDE".toCharArray();
        
        String text = "This is a test";
        StringBuilder builder = new StringBuilder(text.length());
        for (char value : text.toCharArray()) {
            int index = indexOf(value, lookup);
            builder.append(substitution[index]);
        }
        
        String encypted = builder.toString();
        
        System.out.println(text);
        System.out.println(encypted);

        builder = new StringBuilder(text.length());
        for (char value : encypted.toCharArray()) {
            int index = indexOf(value, substitution);
            builder.append(lookup[index]);
        }
        System.out.println(builder.toString());
    }
    
    protected static int indexOf(char value, char[] array) {
        char check = Character.toUpperCase(value);
        for (int index = 0; index < array.length; index++) {
            if (check == array[index]) {
                return index;
            }
        }
        return -1;
    }
}

这将输出类似...

This is a test
XLMWEMWE EXIWX
THIS IS A TEST

现在,显然,这只支持 upper-cased 个字符,不支持其他字符,如数字或标点符号(例如 !)。上面的例子如果字符无法编码也会崩溃,毕竟只是一个想法的例子

一种“不同”的方法

现在,char 是一种特殊类型,因为它实际上可以被视为 int。这与计算机如何对文本进行编码有关,请参阅 ASCII Table 示例。

这意味着我们可以对其进行数学运算 (+/-)。现在,假设我们只想处理“可显示”字符,这为我们提供了 32-126 的基本范围(您也可以使用 128-255 的扩展范围,但现在让我们保持简单)

有了这只手,我们实际上可以做...

public class Main {

    public static void main(String[] args) {
        new Main().encode();
    }

    private static final int MIN_RANGE = 32;
    private static final int MAX_RANGE = 127;
    
    public void encode() {
        String text = "This is a test";
        String encoded = encode(text, 4);
        System.out.println(text);
        System.out.println(encoded);
        System.out.println(encode(encoded, -4));
    }
    
    protected String encode(String value, int offset) {
        StringBuilder sb = new StringBuilder(value.length());
        for (char c : value.toCharArray()) {
            sb.append(encode(c, offset));
        }
        return sb.toString();
    }
    
    protected char encode(char value, int offset) {
        char newValue = (char)(value + offset);
        if (newValue < MIN_RANGE) {
            newValue = (char)(MAX_RANGE - (MIN_RANGE - newValue));
        } else if (newValue > MAX_RANGE) {
            newValue = (char)((newValue - MAX_RANGE) + MIN_RANGE);
        }
        return newValue;
    }
}

哪个输出...

This is a test
Xlmw$mw$e$xiwx
This is a test

如您所见,解码只是将编码后的文本以相反的方向偏移。如果你想改变编码过程,改变偏移量也更容易