如何进行逆向工程算法?

时间:2010-11-13 01:28:51

标签: algorithm encryption cryptography reverse-engineering

我想知道如何改变算法,例如用于存储登录名或密码的算法。

假设我有大量数据:

7262627 -> ? -> 8172

5353773 -> ? -> 1132

等。这只是一个例子。或者说一个被转换为另一个的十六进制字符串。

&h8712 -> &h1283或类似的东西。

如何开始弄清楚算法是什么?一个人从哪里开始?

你会开始尝试不同的转变,xors和希望有些突出吗?我确信有更好的方法,因为这似乎是在黑暗中刺伤。

甚至可以对这种算法进行逆向工程吗?

对不起,如果这是一个愚蠢的问题。感谢您的帮助/指示。

4 个答案:

答案 0 :(得分:8)

人们尝试了一些事情:

  • 获取源代码或反汇编可执行文件。
  • 猜测,基于其他人使用的哈希函数。例如,由32个十六进制数字组成的散列可能是MD5的一次或多次重复,如果您可以获得单个输入/输出对,那么很容易确认或反驳这一点(尽管请参阅下面的“salt”)
  • 统计分析大量输入和输出对,寻找任何类型的模式或相关性,并将这些相关性与已知散列函数的属性和/或系统设计者可能使用的可能操作相关联。这超出了单一技术的范围,进入了一般密码分析领域。
  • 询问作者。安全系统通常不依赖于他们使用的哈希算法的保密性(如果他们这样做,通常不会长时间保持安全)。但是,您给出的示例非常小,密码的安全散列总是涉及一个盐,而您显然不会这样。所以我们可能不会谈论作者有信心这样做的那种系统。

如果哈希的输出只有4位十进制数字,您只需构建一个包含每个可能的7位输入的表及其散列值即可对其进行攻击。然后,您可以反转该表,并进行(一对多)去散列操作。您永远不需要知道哈希是如何实际计算的。你如何获得输入/输出对?好吧,如果局外人可以某种方式指定要散列的值,并查看结果,那么你就拥有了所谓的“选择的明文”,依赖于此的攻击就是“选择的明文攻击”。所以7位数 - >如果以允许选择的明文攻击产生大量输入/输出对的方式使用4位哈希,则它确实非常弱。我意识到这只是一个例子,但它也只是反转它的技术的一个例子。

请注意,对哈希进行反向工程并实际反转它是两回事。你可以弄清楚我正在使用SHA-256,但这对你没有反转它(即给定一个输出,计算出输入值)。没有人知道如何完全反转SHA-256,虽然当然总有彩虹表(见上文“盐”)<conspiracy>至少没有人承认他们这样做,所以对你或我没用。{{1 }}

答案 1 :(得分:3)

可能你不能。假设转换函数已知,如

function hash(text):
    return sha1("secret salt"+text)

但是“秘密盐”是未知的,并且密码强(非常大的随机整数)。即使是大量的纯文本密码对,你也永远不会强迫秘密盐。

事实上,如果已知使用的精确散列函数是两个同样强大的函数之一,那么你甚至无法猜测正在使用哪个函数。

答案 2 :(得分:2)

在黑暗中刺伤会让你精神错乱。有一些算法,根据目前的理解,你不能希望在不知道具体细节的情况下推断现在和宇宙[预测]结束之间的内部运作(可能包括私钥或内部状态)。当然,其中一些算法是现代密码学的基础。

如果你事先知道有一种模式可以发现,有时候有办法接近这个。例如,如果数据集包含多个相差1的输入值,请比较相应的输出值:

7262627 -> 8172
7262628 -> 819
7262629 -> 1732
...
7262631 -> 3558

这里相当清楚(给出几分钟和一个计算器)当输入增加1时,输出增加913模8266(即一个简单的linear congruential generator)。

Differential cryptanalysis是一种相对现代的技术,用于分析加密分组密码的强度,依赖于密码算法已知的类似但更复杂的概念,但假设私钥 isn'吨。考虑通过单个位彼此不同的输入块,并且通过密码跟踪该位的影响,以推断每个输出位被“翻转”的可能性。

解决这类问题的其他方法是查看极端值(最大值,最小值),分布(导致frequency analysis),方向(数字是否总是增加?减少?)和(如果这是允许的)考虑找到数据集的上下文。例如,某些类型的PIN码总是包含一个重复的数字,以便于记忆(我不是说PIN码必须从其他任何地方推断出 - 只是重复的数字是一个数字要担心!)。

答案 3 :(得分:0)

  

甚至可以对这种算法进行逆向工程吗?

有可能使用有缺陷的算法和足够的加密/未加密对,但设计良好的算法可以消除这样做的可能性。