这种加密功能是可逆的吗?

时间:2017-08-04 00:59:21

标签: java arrays algorithm encryption

我目前正在开展一项小型挑战,试图弄清楚一个未命名的加密算法是如何运作的。原始算法如下所示:

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)之间
  • 解码时,第一步是减去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循环,特别是变量ibase很难找到。我所拥有的唯一信息是加密的单词,以及原始单词在MAX 时长度为的20个文字(因此为[4][20]维度)。

加密对我来说并不熟悉,这使我无法选择查找此算法的名称。

如果可以反转此算法,我的下一步是什么?

1 个答案:

答案 0 :(得分:2)

不,在一般情况下,这显然不可逆转。

输出中有效的40位信息(8个字节,每个5位 - & 0x1F限制每一个到5位)。这意味着只有2个 40 可能的输出;有更多可能的投入。

如果对输入有一些限制 - 例如,如果知道它的长度很短 - 可能会对此做出一些推论。但是,你没有说明任何限制,所以......