我知道这可能不是最好的地方,但是我相信这个社区可能是我可以问这样的问题的最佳/唯一地方。

我有很多投入和产出,几年前开发的内部哈希,开发人员不再与我们合作。我需要确定哈希的过程。在您提到这是不可能的之前,它似乎是一个相对简单的哈希,并且我有一些理论可以使我朝正确的方向入手。首先,数据:在我看来,这似乎不是一个很好的哈希值。

 Input   Hash
1293239 EHELKHE
1331487 ILZXFZF
1320709 IKYJXWH
1328166 GUVUMMY
1156693 HFXLFYZ
1313273 ELHZLZV
1287367 GKDMWGM
1318623 EHDHYYF


对于启动器,输出长度与输入长度匹配,尽管这可能是巧合。引起我注意的主要是,输出字符似乎全部存在于特定的可能性池中。以下是唯一的输出字符列表:DEFGHIJKLMUVWWXYZ。这与0123456789ABCDEF的十六进制值完全一致,实际上,在ASCII值中,这两组值彼此相距20。所以我的假设是:

D = 0
E = 1
F = 2
G = 3
H = 4
I = 5
J = 6
K = 7
L = 8
M = 9
U = A
V = B
W = C
X = D
Y = E
Z = F


从那里开始,我没有主意了。我已经将散列结果与许多标准哈希进行了比较,没有发现相关性,并确定它很可能是原始过程。我已经尽力发挥了数字,但没有取得任何进展。可以使用哪些技术来分析此哈希?

评论

因此,这里有7 * 4 = 28位输出。

根据FAQ中的问题3,这在技术上是不合主题的。但是...我们可以偶尔玩得开心吧?

@JohnGietzen,您在谈论哪个常见问题解答? crypto.stackexchange.com/faq?

@Pacerier,这个问题是3岁。

@JohnGietzen,那么该FAQ中的#3是什么?

#1 楼

您是正确的,它是“错误哈希”。实际上,它根本不是哈希。我曾在一家使用稍微不同的方案来混淆URL中的数据库键/数字的公司工作。我还曾在另一家公司工作,该公司使用的方案看起来与电子设备的解锁代码惊人地相似。

将“哈希”转换回输入的公式如下:


取“哈希”(下面的“哈希”列”)并使用替换密码(E转到1等)将其转换为十六进制(下面的列“ subs”)。
将结果转换为十进制(下面的列“ to dec”)。
您有一个8位数字,请交换数字的前半部分和后半部分(下面的“交换”列)。将结果除以3乘以13,以获得客户ID(下面的“除”列)。

"hash".....subs......to dec......swap.....divide EHELKHE - 1418741 - 21071681 - 16812107 - 1293239 ILZXFZF - 58FD2F2 - 93311730 - 17309331 - 1331487 IKYJXWH - 57E6DC4 - 92171716 - 17169217 - 1320709 GUVUMMY - 3ABA99E - 61581726 - 17266158 - 1328166 HFXLFYZ - 42D82EF - 70091503 - 15037009 - 1156693 ELHZLZV - 184F8FB - 25491707 - 17072549 - 1313273 GKDMWGM - 3709C39 - 57711673 - 16735771 - 1287367 EHDHYYF - 1404EE2 - 20991714 - 17142099 - 1318623
对于将来可能会发现此问题的人们,它有助于制作电子表格和乘法表(客户ID * 1至客户ID * 50)。这些通常是简单的线性公式,例如$ mx + b $,有时涉及取模(例如$ mx + b \ mod c $),有时还添加“垃圾”数字,使事情难以逆向工程。 >
DW的“选择明文”攻击的想法也是一个很好的选择。如果您有成对的客户ID和“哈希”在客户ID中仅相差一个数字,则可能会更容易受到攻击。

“默默无闻的安全性”根本不是安全性。今晚我花了大约2个小时避免做作业。

评论


$ \ begingroup $
因此,最好将其称为编码而不是哈希。通过将每个数字都除以13,它具有一种校验和。不错的发现。
$ \ endgroup $
–PaŭloEbermann
2011年8月5日14:22

$ \ begingroup $
哇,效果很好!它也适用于我在列表中未提及的一些值。可能有些不足,但是它给了我一种盲目测试人们发布的答案的方法。有关步骤3的一条信息,如果您的数字少于8位,请在交换前在左侧填充0。非常感谢。
$ \ endgroup $
–user316
2011年8月5日15:26

$ \ begingroup $
该编码有名称吗?
$ \ endgroup $
– Corey Ogburn
2012年2月23日在20:07

$ \ begingroup $
@CoreyOgburn,这比其他任何事情都更加令人困惑。我不知道它的任何正式名称,但是大多数“数学”都是用于PRNG的线性同余生成器。 zh.wikipedia.org/wiki/Linear_congruential_generator
$ \ endgroup $
– Tangurena
2012年2月24日在18:35

$ \ begingroup $
@Tangurena,您花了2个小时打破它?
$ \ endgroup $
–起搏器
2014年11月21日在6:19

#2 楼

我同意对二进制代码进行逆向工程可能是一种值得的方法。

另一种选择是尝试选择明文攻击。例如,尝试对0000、0001、0002,...,0009、0010,..,0090,..,1000,..,9000进行散列,然后看看可以从中学到什么。

#3 楼

由于输入是10的基数,输出是16的基数,因此输出实际上看起来比输入大。

您可以访问二进制代码实现吗?最简单的拆卸或调试。

您可以访问多少个散列对样本?您可以使用选定的输入生成更多内容吗?

构建它的开发人员的技能和思维方式是什么?他什么时候制作的?

这是软件许可证密钥破解吗? :-)

编辑:由于它是C ++编译的,因此您可以反汇编或调试可执行文件以提取算法。这总是比尝试将其转换为黑匣子要容易得多。

提示:要查找密码,请查找操作数与其自身寄存器不同的XOR指令。如果发现使用了魔术常数,请对其进行网络搜索。他们可能会准确告诉您正在使用哪种算法。

评论


$ \ begingroup $
我对以前的开发人员一无所知,但我知道他的代码是几年前添加到该站点的。这不是许可证密钥破解,我们使用它来单独引用ID(输入),而无需在将ID输入到网站时透露它们。
$ \ endgroup $
–user316
2011年8月3日在16:04

$ \ begingroup $
老实说,这个网站搞砸了。它是编译的C ++。因此,为什么我们要用更好的东西代替它。我们没有来源,只有业务需求。问题在于它需要使用数据库中的现有数据。所以我必须重新创建哈希。
$ \ endgroup $
–user316
2011年8月3日在16:22

$ \ begingroup $
@ user316-还有另一种解决方案。您只需获取需要哈希值的列表,然后使用旧代码进行计算即可。然后以这种方式迁移新站点的数据。
$ \ endgroup $
–乍得
2011年8月3日在16:46