我目前正在开展一项小型挑战,试图弄清楚一个未命名的加密算法是如何运作的。原始算法如下所示:
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有些神秘的文本。我发现了其他相关事项:
char[] result
始终中的编码字符的文字值介于 48 和 111 (0x3F + 48
)之间&
操作。由于0x3F
等于二进制表示111111
,因此原始字节的值是4种可能之一:
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种可能性插入到2D阵列中。但我坚持解决嵌套的for循环,特别是变量i
和base
很难找到。我所拥有的唯一信息是加密的单词,以及原始单词在MAX 时长度为的20个文字(因此为[4][20]
维度)。
加密对我来说并不熟悉,这使我无法选择查找此算法的名称。
如果可以反转此算法,我的下一步是什么?
答案 0 :(得分:2)
不,在一般情况下,这显然不可逆转。
输出中有效的40位信息(8个字节,每个5位 - & 0x1F
限制每一个到5位)。这意味着只有2个 40 可能的输出;有更多可能的投入。
如果对输入有一些限制 - 例如,如果知道它的长度很短 - 可能会对此做出一些推论。但是,你没有说明任何限制,所以......