-1

这应该解密文件。我正在尝试找出算法,但在理解正在发生的事情时遇到了一些问题。有什么提示吗?谢谢!

      localStringBuilder1 = new StringBuilder("");
      localStringBuilder2 = new StringBuilder("");
      Matcher localMatcher = Pattern.compile("[a-zA-z_\\-]+\\.html").matcher(paramString); //paramString is the encrypted file
      localMatcher.find();
      String str2 = localMatcher.group();
for (Integer localInteger1 = Integer.valueOf(0); localInteger1
            .intValue() < str2.length(); localInteger1 = Integer
            .valueOf(1 + localInteger1.intValue())) {
        localStringBuilder2.append(1 + Math.round(str2
                .codePointAt(localInteger1.intValue()) % 3));
        if (localInteger1.intValue() < "fdjkhireuhsdthuirdfg".length())
            localStringBuilder2.append(1 + Math
                    .round("fdjkhireuhsdthuirdfg".codePointAt(localInteger1
                            .intValue()) % 3));
    }

更新:简化循环

for (int i = 0; i < str2.length(); i++) {
        localStringBuilder2.append(1 + Math.round(str2
                .codePointAt(i) % 3));
        if (i < "fdjkhireuhsdthuirdfg".length())
            localStringBuilder2.append(1 + Math
                    .round("fdjkhireuhsdthuirdfg".codePointAt(i) % 3));
    }

你可以在这里找到完整的源代码

编辑 非常感谢 Vandey 解决了产生的字符串:“21321223331121”

然而,这并没有得到完整的答案。下一部分是(让我大吃一惊):

label249: if (localInteger2.intValue() < i);
    try
    {
      localStringBuilder1.append((char)(Integer.parseInt(str1.substring(0 + localInteger2.intValue(), 2 + localInteger2.intValue()), 16) - Integer.parseInt(localStringBuilder2.substring(localInteger2.intValue() / 2 % localStringBuilder2.length(), 1 + localInteger2.intValue() / 2 % localStringBuilder2.length()))));
      label327: localInteger2 = Integer.valueOf(2 + localInteger2.intValue());
      break label249;
      str3 = localStringBuilder1.toString();
    }
    catch (StringIndexOutOfBoundsException localStringIndexOutOfBoundsException)
    {
      break label327;
    }
4

4 回答 4

0

我建议设置一个断点并在执行代码时逐步执行代码。观察不同的表达方式,并根据代码的作用使用这些信息。这应该比仅仅查看代码并尝试理解要容易得多。

于 2012-10-03T05:40:44.827 回答
0

据我所知,对于 str2 的每个字符,stringBuilder 将为每个循环附加一个两位数,该数字由数字 1,2 和 3 组成,这意味着总共有 9 个这样的数字是可能的。你最终会得到一系列 1,2,3...(不按顺序),每对连续的字符,都会暗示一组字符,但是每个解密字符的令牌会随着这对字符的位置而变化字符串生成器中的数字。

此外,对于 stringBuilder 中的每对连续数字,只有三个 2digit 数字是可能的,因为数字的第二位由您的“fdjk ...”字符串固定。

于 2012-10-03T05:48:36.370 回答
0

str2 在这里是硬编码的,为它工作,否则它应该非常接近它。任何人,请随时将其编辑到正确的方向。添加最后一个打印行只是为了查看它打印的内容。很抱歉误导变量名。

    String str2 = "abcdefg";
    String toCompare = "fdjkhireuhsdthuirdf(g"; //looks like this changed when  you updated your question
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str2.length(); i++) {
        char ch = str2.charAt(i);
        int charInt1 = ch % 3;

        sb.append(1 + Math.round(charInt1));

        if (i < toCompare.length()) {
            char ch2 = toCompare.charAt(i);
            int charInt2 = ch2 % 3;
            sb.append(1 + Math.round(charInt2));
        }
    }
    System.out.println(sb.toString()); // printed 21321223331121 
于 2012-10-03T05:56:05.433 回答
0

爱洛克,

看看你的班级和功能。这个函数只访问局部变量,它什么也不返回(虽然它应该返回一个字符串)。

你会从中得到什么?

于 2012-10-03T05:56:26.953 回答