尝试用Java编写解密函数

尝试用Java编写解密函数,java,encryption,Java,Encryption,我终于完成了插件,并开始了另一个项目的工作。该项目是一个简单的软件,可以在给定加密密钥和字符串本身的情况下对字符串进行加密。所以我写了这个,它似乎工作得很好,但我不知道如何解密它。我曾经有一个带有加密字母表的数组,但我找到了一种在加密函数中不使用它的方法,在解密中也应该有一种不使用它的方法 我的加密功能: public static String e(String toEncrypt, int encKey) { encKey %= ALPHABET.length; toEncr

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

我的加密功能:

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;
}
我不只是为了得到偏移字符而创建一个新数组,而是通过简单的加法和余数操作符来实现。我试着用减法和同样的方法,但它不起作用,因为我需要它来绕到26。不知怎的,我觉得有些显而易见的东西就是解决办法。

试试这个:

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 String decrypt(String encoded) {
return e(encoded.substring(0, encoded.indexOf("`")),
                    -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                    false);
}
解密和加密的工作方式基本相同,但解密使用相反的加密密钥(例如,它将使用-22而不是22),这是在调用中完成的。您在“`”符号后添加encKey-我不想在解码消息中添加该符号,所以我在将编码字符串解析为方法时将其删除,并添加booleam参数addEncKey,以便禁用添加addEncKey。 我还更改了这一行的代码: TEChar[i]=字母表[(j+encKey+ALPHABET.length) %字母表长度]; 这是一种处理encKey为负时可能出现的负索引的简单方法。

尝试以下方法:

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 String decrypt(String encoded) {
return e(encoded.substring(0, encoded.indexOf("`")),
                    -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                    false);
}
解密和加密的工作方式基本相同,但解密使用相反的加密密钥(例如,它将使用-22而不是22),这是在调用中完成的。您在“`”符号后添加encKey-我不想在解码消息中添加该符号,所以我在将编码字符串解析为方法时将其删除,并添加booleam参数addEncKey,以便禁用添加addEncKey。 我还更改了这一行的代码: TEChar[i]=字母表[(j+encKey+ALPHABET.length) %字母表长度];
这是一种处理encKey为负时可能发生的负索引的简单方法。

您可以发布您的解密代码尝试吗?(
我尝试使用减法,但它不起作用,因为我需要它将其压缩到26
)@irrelephant我会的,但我删除了它并一直尝试,直到我意识到我可以在这里提问。只需将
+
操作符更改为
-
:@irrelephant-这几乎很简单,你只需要解释负数。你能发布你的解密代码尝试吗?(
我试着使用减法,但它不起作用,因为我需要它将值压缩到26
)@irrelephant我会的,但是在我意识到我可以在这里提问之前,我删除了它并继续尝试。只需将
+
操作符更改为
-
:@irrelephant-这几乎很简单,你只需要解释负数。哇……非常感谢!我自己编写了一点代码,根本没有考虑添加
字母表。length
防止负面。我基本上要把你给我的和irrelephant在评论中给出的结合起来。再次,谢谢!哇…太感谢了!我自己做了一点代码,根本没有考虑添加
字母表。长度
来防止负面。我基本上要把你给我的和irrelephant的结合起来We’我有一个评论。再次感谢!