【问题标题】:Is this encryption function reversible?这个加密函数是可逆的吗?
【发布时间】: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[] result always 中的编码字符的文字值介于 48111 (0x3F + 48) 之间。
  • 解码时,第一步是减去 48,然后撤消 &amp; 操作。由于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 循环,尤其是变量 ibase 很难找到。我拥有的唯一信息是加密的单词以及原始单词的长度为 20 个字面值最大(因此是 [4][20] 维度)。

加密对我来说并不熟悉,这让我无法找到该算法的名称。

如果可以逆转这个算法,我的下一步是什么?

【问题讨论】:

  • 这不是加密。这是一个哈希函数。
  • @selbie 对不起,你是对的,我只需要在stackoverflow.com/questions/4948322/… 上阅读它们之间的确切区别:)
  • 尝试将加密字符串转换为char数组,并根据您的转换标准将每个字符转换为。所以你会扭转它。
  • @Tehmina 这就是我想要做的。我在这个问题中发布了我所有的行为和研究,但是(现在/永远)不可能反转,因为我不知道如何反转嵌套的 for 循环。

标签: java arrays algorithm encryption


【解决方案1】:

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

输出中实际上有 40 位信息(8 个字节,每个 5 位——&amp; 0x1F 限制每个 1 到 5 位)。这意味着只有 240 个可能的输出;可能的输入远不止这些。

如果对输入有一些限制——例如,如果已知它的长度很短——那么就有可能对此做出一些推论。但是,您没有说明任何限制,所以……

【讨论】:

  • 好的,所以肯定没有办法找到正确的。嵌套的for循环怎么样?这是可逆的吗?我知道有太多的可能性,但是在这种特定情况下,用可能的值填充矩阵会有所帮助。
  • 计算出“可能的值”不太可能有助于分析此算法。
猜你喜欢
  • 2014-09-29
  • 2019-11-27
  • 1970-01-01
  • 2017-10-04
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多