我想知道如何改变算法,例如用于存储登录名或密码的算法。
假设我有大量数据:
7262627 -> ? -> 8172
5353773 -> ? -> 1132
等。这只是一个例子。或者说一个被转换为另一个的十六进制字符串。
&h8712 -> &h1283
或类似的东西。
如何开始弄清楚算法是什么?一个人从哪里开始?
你会开始尝试不同的转变,xors和希望有些突出吗?我确信有更好的方法,因为这似乎是在黑暗中刺伤。
甚至可以对这种算法进行逆向工程吗?
对不起,如果这是一个愚蠢的问题。感谢您的帮助/指示。
答案 0 :(得分:8)
人们尝试了一些事情:
如果哈希的输出只有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)
甚至可以对这种算法进行逆向工程吗?
有可能使用有缺陷的算法和足够的加密/未加密对,但设计良好的算法可以消除这样做的可能性。