【发布时间】:2017-08-04 10:05:08
【问题描述】:
我目前正在处理一个小挑战,试图弄清楚一个未命名的加密算法是如何工作的。原来的算法是这样的:
public final String a(byte[] original)
{
this.a = original.length;
byte[] solution = new byte[8];
int i = 0;
int base = 13;
for (int si = 0; si < 8; si++)
{
for (int oi = 0; oi < a; oi++)
{
byte current = original[oi];
solution[i] = ((byte)(solution[i] + (current ^ base)));
base = (base ^ i) + solution[i];
i = (i + 1) % 8;
}
}
char[] result = new char[8];
for (int n = 0; n < 8; n++) {
result[n] = ((char)((solution[n] & 0x3F) + 48));
}
return String.valueOf(result);
}
因此,作为byte[] 数组传递给此函数的每个字符串都将被编码为8 字符的有点神秘的文本。我发现了关于此的其他事情:
-
char[] resultalways 中的编码字符的文字值介于 48 和 111 (0x3F + 48) 之间。 - 解码时,第一步是减去 48,然后撤消
&操作。由于0x3F等于二进制表示111111,因此原始字节的值是四种可能性之一:-
00xxxxxx:丢失的 2 位都是零。 -
01xxxxxx:两者的低地址位都是一。 -
10xxxxxx:两者的高地址位都是一。 -
11xxxxxx: 两人合而为一。
-
意思是,它可能是四个字符之一。我最初考虑反转算法,但我问你这种算法是否可能。我试过了,走了这么远:
public static String b(String encrypted) {
byte[][] matrix = new byte[4][20];
byte[] word = encrypted.getBytes();
for(int i = 0; i < 4; i++) {
for(int j = 0; j < word.length; j++) {
byte tmp = (byte)(word[i] - 48);
matrix[i][j] = (byte)(tmp + i);
}
}
}
我目前减去 48 并将所有 4 种可能性插入到二维数组中。但是我坚持解决嵌套的 for 循环,尤其是变量 i 和 base 很难找到。我拥有的唯一信息是加密的单词以及原始单词的长度为 20 个字面值最大(因此是 [4][20] 维度)。
加密对我来说并不熟悉,这让我无法找到该算法的名称。
如果可以逆转这个算法,我的下一步是什么?
【问题讨论】:
-
这不是加密。这是一个哈希函数。
-
@selbie 对不起,你是对的,我只需要在stackoverflow.com/questions/4948322/… 上阅读它们之间的确切区别:)
-
尝试将加密字符串转换为char数组,并根据您的转换标准将每个字符转换为。所以你会扭转它。
-
@Tehmina 这就是我想要做的。我在这个问题中发布了我所有的行为和研究,但是(现在/永远)不可能反转,因为我不知道如何反转嵌套的 for 循环。
标签: java arrays algorithm encryption