1

我终于完成了插件,并开始着手另一个项目。该项目是一个简单的软件,可以在给定加密密钥和字符串本身的情况下加密字符串。所以我写了那个,它似乎工作正常,但我不知道如何解密它。我曾经有一个带有加密字母表的数组,但我想出了一种在加密函数中不使用它的方法,并且在解密时也应该有一种方法可以不使用它。

我的加密功能:

public static String e(String toEncrypt, int encKey) {
    encKey %= ALPHABET.length;
    toEncrypt = toEncrypt.toLowerCase();
    char[] TEChar = toEncrypt.toCharArray();
    for (int i = 0; i < toEncrypt.length(); i++) {
        for (int j = 0; j < ALPHABET.length; j++) {
            if (TEChar[i] == '`') {
                TEChar[i] = '_';
            }
            else if (TEChar[i] == ALPHABET[j]) {
                TEChar[i] = ALPHABET[(j + encKey) % ALPHABET.length];
                break;
            }
        }
    }
    toEncrypt = String.valueOf(TEChar) + "`" + encKey;
    return toEncrypt;
}

ALPHABET (数组,我意识到它包含的不仅仅是字母表。):

 char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '1',
'2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', ';', ':', '[', ']', '{',
'}', '?'};

我没有创建一个新数组来仅包含偏移字符,而是通过简单的添加和使用余数运算符来做到这一点。我尝试使用减法和同样的方法,但它不起作用,因为我需要它来回绕到 26。不知何故,我觉得解决方案是显而易见的。

4

1 回答 1

1

试试这个:

public static String e(String toEncrypt, int encKey, boolean addEncKey) {       
    encKey %= ALPHABET.length;
    toEncrypt = toEncrypt.toLowerCase();
    char[] TEChar = toEncrypt.toCharArray();
    for (int i = 0; i < toEncrypt.length(); i++) {
        for (int j = 0; j < ALPHABET.length; j++) {
            if (TEChar[i] == '`') {
                TEChar[i] = '_';
            } else if (TEChar[i] == ALPHABET[j]) {
                TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length)
                        % ALPHABET.length];
                break;
            }
        }
    }
    if (addEncKey) {
        toEncrypt = String.valueOf(TEChar) + "`" + encKey;
    } else {
        toEncrypt = String.valueOf(TEChar);
    }
    return toEncrypt;
}

这就是我测试它的方式:

public static void main(String[] args) {
        String encoded = e("ABDSDfz}", 2, true);
        System.out.println(encoded);
        String decoded = e(
encoded.substring(0, encoded.indexOf("`")),
                -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                false);
        System.out.println(decoded);

    }

如您所见,我将一些逻辑移至方法调用(您可以轻松编写一个包含加密的解密函数,如下所示:

public static String decrypt(String encoded) {
return e(encoded.substring(0, encoded.indexOf("`")),
                    -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                    false);
}

解密和加密的工作方式基本相同,但解密使用相反的 encKey(例如,它将使用 -22 而不是 22),这是在调用中完成的。您在 '`' 符号后添加 encKey - 我不希望在解码的消息中使用它,所以我在将编码字符串解析为方法并添加布尔参数 addEncKey 时将其删除,因此我可以禁用添加 addEncKey。我还在代码中更改了这一行: TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length) % ALPHABET.length]; 这是处理 encKey 为负时可能发生的负索引的简单方法。

于 2012-12-12T18:48:26.747 回答