尝试用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’我有一个评论。再次感谢!