如何将这个散列字符串转换为可用字符串?

How can I convert this hashed string to a usable string?

我找到了一个字符串,它可能是在 base64 中散列的。在我尝试过的每种编码中对其进行解码 returns 错误字符。我也无法访问生成它的代码,也无法对其进行逆向工程。

这是 base64: AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=

现在,它的长度为 60 字节,并且所有字符都对 base64 有效,如果您有比 base64 更好的猜测,请告诉我!

我也把它转换成一个字节数组,但我真的不知道如何将字节数组转换成不同编码的字符串。也许我可以 运行 为每个循环使用不同的编码打印结果字符串,直到我找到一个真正的文本?

这是《炉石传说》中的新牌组编码。它确实是有效的 base64,它永远不会转换为纯文本。

$ echo 'AAECAR8GxwPJBLsFmQfZB/gIDI0B2AGoArUDhwSSBe0G6wfbCe0JgQr+DAA=' | base64 -D | od -t u1
0000000     0   1   2   1  31   6 199   3 201   4 187   5 153   7 217   7
0000020   248   8  12 141   1 216   1 168   2 181   3 135   4 146   5 237
0000040     6 235   7 219   9 237   9 129  10 254  12   0
0000054

这很可能是炉石传说特有的自定义结构序列化格式,其中一个字段表示class,其余的是卡牌ID号的映射(我认为这不是public yet) 到卡的数量。如果重新排列格式,您可以清楚地看到一些模式:

   0   1
   2   1
  31   6
 199   3
 201   4
 187   5
 153   7
 217   7
 248   8
  12
 141   1
 216   1
 168   2
 181   3
 135   4
 146   5
 237   6
 235   7
 219   9
 237   9
 129  10
 254  12
   0

在新的更新发布之前,我们真的无法了解更多。更新出来后,很容易做实验,导出一张只有一张卡的牌组并比较结果。

以 Tenchi2xh 的答案为基础,我们可以使用 the decklist that comes with the string 来帮助弄清楚数字的含义。

  • 0 1 2 1 31 - 某种 header,可能表示 class、格式和年份
  • 6 - 牌组中出现 1 次的牌数
  • 然后有 12 个字节,我们可以将它们解释为 6 个 16 位整数:967 1225 1467 1945 2009 2296 - 每一个都是一张牌,在牌组中出现 1x
  • 12 - 每张牌在牌组中出现 2 次的牌数
  • 另外 12 个 16 位整数:397 472 680 949 1159 1426 1773 2027 2523 2541 2689 3326 - 每个都是一张出现 2x
  • 的卡片
  • 0 - 末尾填充

最后要弄清楚的是那些 16 位数字指的是哪些卡。幸运的是,它并不太复杂,它们只是卡片 "DBF IDs" 的略微修改版本。我在 HearthstoneJSON 上查看了这些内容。从数字 x 中获取 DBF ID 的方法是:

dbfId = (x >> 8) << 7 | (x % 128)(也就是低7位不变,其余右移1)

例如:967解码为DBF ID 455,即Snake Trap。 3326对应DBF ID 1662,即鹰角弓