如何逆向工程一个加密算法?

21

我编写了一款这样加密文本的应用程序:

  1. 获取输入的文本

  2. 翻转文本

  3. 转换为十六进制

  4. 与密钥异或

  5. 进行Base64编码

现在,我没有进行过很多加密/编码,所以我的问题可能听起来有些愚蠢,但假设我得到一个具有上述算法内容的文件,而我并不知道这个算法。如何开始"破解"文本?是否有任何指南、原则或规则可供遵循?

我的问题不限于这五个步骤,那只是一个纯粹的例子。

另一个例子,假设文本为:A751CD9E1F99。我该如何开始破译它的含义?


1
帖子标题应涉及密码学或加密。 - user447688
6
当有人将一个问题标记为“收藏”,却没有点赞的时候,我会感到有点烦。除非有些特殊情况,否则我很难理解这种行为的意义。(实际上,我刚刚想到,可能是因为有很多人点了“踩”,才导致这样的情况)。 - JoeCool
4
“Favorite”并不一定表示你喜欢这个问题,这个称呼其实有些误导。我通常会把它当作是“收藏”,以便随时关注这些问题。 - erickson
1
实际上,乔,尽管不是我,但我们中有些人将收藏夹用作不想丢失的问题的文件/列表。我们并不一定喜欢它们,只是想再次找到它们(有时因为它们很有趣)。 - RBarryYoung
1
有道理。注意到了,你成功地平息了我的挫败感 :) - JoeCool
显示剩余3条评论
11个回答

21
为了破解密码,密码分析员会利用他们所能收集到的所有信息。攻击分为多种类型,取决于已知的信息量。其中一些主要的攻击类型,从最难到最容易,如下:
  • 仅密文:这是最难的攻击。分析员尝试收集尽可能多的加密消息,并分析它们以查找符号频率中的模式或偏差。然而,对于好的、现代的密码,没有模式。在使用良好的密码时,这是不可行的。
  • 已知明文:拥有某些密文对应的明文是从新的密文中恢复未知明文的重要步骤。这是“逆向工程”真正开始的地方,因为他可以根据已知的输入和输出测试算法的假设。在第二次世界大战期间,密码分析员努力建立了广泛的“cribs”列表——可能出现在敌人消息中的单词——以利用已知明文攻击。例如,特定天气条件或战斗地点等可能被报告给总部的加密消息。
  • 选择明文:更好的方法是,当密码分析员可以欺骗他的敌人加密由密码分析员创建的消息时。在战争中,有时会向敌人泄露虚假信息,希望它会被加密并帮助密码分析员破解代码。
  • 自适应选择明文:这是一种迭代的已知明文方法。密码分析员可以反复让他选择的明文被系统加密,并查看结果以调整下一次尝试。
现如今,破解密码的常见方法是通过系统漏洞。例如,可能会使用不良密钥管理,导致密钥被盗或者猜测。在其他情况下,可能会使用"侧信道"攻击。例如,通过仔细测量某些加密操作所需的时间,攻击者可能能够猜测出密钥中某些位或字节为零,从而通过某些算法找到快速通路。
在谈及最保密的技术时,有一种方法是截取计算设备的无线电波发射。这使得远程代理可以“看到”显示器上显示的内容。甚至还设计了特殊的字体来尝试干扰这种窃听。

6
基本上,这种加密方式很容易被破解。 Base64编码也很容易被识别。(你只使用了64个字符,这是Base64的典型特征。) 接下来需要找到原始XOR密钥。这有点难,但如果有足够的加密数据,则有几种算法可以检测这些密钥。 您提供的简单文本不足以支持这一点,但如果他们知道它应该变成十六进制字符串,那么事情就变得容易多了。 然后,他们必须对您的其他步骤进行反向操作。所有这些步骤都太容易了。
如果可能,黑客可以在知道加密前的原始值的情况下进行破解。在这种情况下,即使提供的字符串很短,也足以至少发现您完整的加密过程,尽管用于XOR字符串的密钥可能不完全知道。
好的,让我们试着解密A751CD9E1F99... 12个字符。您似乎只使用了一些字符,因此它似乎只是一些十六进制字符串。原始值必须为6个字符。值将在0x51到0xCD的范围内,这太大而无法用于base64编码。此外,由于大多数值都高于0x7F,这表明您已对其进行了一些编码。字典攻击可能已经提供了关于所使用的XOR密钥的一些见解,其中您将6个十六进制值与许多6个字符的单词进行XOR,以查看哪个返回字典中的另一个单词。似乎返回有效单词的那些单词可以是您用于XOR原始值的密钥。在第二个加密字符串上,可以再次使用这些发现的密钥,将可能的密钥集过滤为更小的集合。在现代系统上,这种字典攻击可能在一天内返回结果。
大约50年前,这种加密方案非常强大。如今,预计会在一天内被任何有兴趣尝试破译的人破解掉。
我不是破解密码的专家,但我知道哪些加密方法太弱而不该使用。大约10年前,我参与了一个项目,该项目使用类似于您的复杂XOR机制的加密文件存储密码。然后,客户决定检查安全性,并让专家调查只有密码文件。他只知道一个用户名和密码,该用户帐户没有管理权限。但这足够的信息使他能够在一个小时内破解该安全性,读取有关管理员帐户的信息,然后使用该信息做任何他想做的事情。我的公司随后为他提供了一周的免费啤酒... :-) 因此,10年前,专家只需要一个小时。如今,他们可以相对轻松地破解更复杂的算法,只是因为计算机更加强大。如果您必须使用这种加密方式,那么您可能不妨不使用任何加密方式。对于黑客来说,这并不重要。

5

如果你知道如何解密,就可以尝试猜测算法。我可以创建许多算法,使某些输入的结果为“A751CD9E1F99”。

现在,如果你有许多输入/输出可用,你可以尝试稍微改变一下你的输入,看看输出会发生什么,例如。好的加密算法通常会对微小的输入变化产生重大的输出变化。


5

我认为你应该从阅读《密码编码学入门》开始。你所问的是如何破解加密方法,这将让你了解它们的工作方式。


4

3

如果您想要破译某个密文,需要拥有比这更大的文本库,并且对该密文所属的特定语言/领域有一定的了解。然后根据该语言/领域中单词的频率,可能可以从文本中解密出某些属性。

当然,好的加密方法可以避免这种情况。只有实现不良的加密方法才能轻易地通过此方法破解。


2

密文不可区分性是一个很好的起点,用于理解加密算法的设计目的是为了防止/抵御什么。提到的攻击类型(例如IND-CPA)也可以给你一些线索,让你开始入门。


1

攻击者通常会执行以下操作:

识别和打败任何“肉眼可见的编码”或琐碎的加密,例如文本反转、Base64编码、ROT13等。

当他们发现高熵状态时,尝试获取更多的编码数据片段,并将它们进行异或运算。如果编码确实是基于异或(如RC4)且密钥是恒定的,则结果是两个原始明文与密钥相互抵消。如果攻击者可以获得任何明文-编码数据组合,则所有其他编码数据都可以解码。

在最后绝望的情况下,他们可能会尝试测试最常见的实践,例如使用RC4或其他简单算法和动态密钥,在文件/数据的末尾或开头放置密钥。

如果他们只能访问编码文本,则这几乎是无路可走的。如果他们有访问权限,例如可以生成提供的明文的编码版本的API,则他们将轻松识别其是否为基于位(如XOR)、块密码或前馈块密码编码,但获取密钥和实际算法仍然是一个问题。

如果他们可以访问对称密钥加密的解码程序(比如XOR),或非对称密钥加密的编码程序,那么编码很可能会被立即破解。

0

如果您可以访问执行加密的黑盒,您可以通过提供特定的输入值来获取大量信息。

举个简单的例子,如果黑盒执行“一次性密码本”式的加密,如果您提供全零输入,则可以获得一次性密码本。(实际上,提供任何输入值都将获得带有额外异或的一次性密码本。)

请注意,即使已知加密系统(但未知密钥),好的加密系统也会抵御此类攻击。


2
一个指的是你可以安全使用它的次数,而不是它实际被使用的次数! :-) - Captain Segfault

-1

这有点不可能,如果你不知道使用了什么密钥,你会在XOR解密中失败。

一般情况下,甚至更加不可能(如果可能的话:))去判断一个加密字符串可能意味着什么。


这就是我的问题所在。你会如何开始调查、探究呢?另一个例子是,你会如何发现一段文本是使用Blowfish算法加密的? - Alexandru Luchian
这不是不可能,而是绝对不可能(假设密钥只用于一条消息)。请查看维基百科上的“一次性密码本”。 - swampsjohn
在网上查找密码分析方法。有暴力破解和近似方法可以帮助你。至于Blowfish算法,如果有人知道一个文本是否使用它进行加密,那么再使用它也没有意义了,不是吗? - SuPra
1
这也假设你对纯文本没有任何了解(比如他加密了 JPEG 而不是文本,你可以搜索头信息),并且假设密钥的长度与纯文本相同(如果密钥是 8 位(假设 ASCII 文本),那么这实际上只会变成一种替换密码)。 - Niki Yoshiuchi
2
加密算法的理念是,只要别人不知道密钥,就算他们知道算法也无妨。 - David Thornley
即使密钥仅用于单个消息,也可能不符合一次性密码(OTP)的要求。您还需要在明文和密钥之间进行逐位对应,因此您不能使用1024位OTP安全地加密1MiB消息(理论上密钥的每个重复位都是可破解的)。 - Eduard - Gabriel Munteanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接