【问题标题】:How would I reverse engineer a cryptographic algorithm?我将如何对加密算法进行逆向工程?
【发布时间】:2010-11-02 14:01:22
【问题描述】:

我写了一个用这种方式加密文本的应用程序:

  1. 获取输入文本

  2. 反转文本

  3. 转换为十六进制

  4. 与键异或

  5. Base64 编码

现在,我自己并没有做很多加密/编码,所以我的问题可能听起来很愚蠢,但是,假设我得到一个包含上述算法内容的文件,而我不知道这个算法。一个人如何开始“破坏”文本,是否有任何指导方针、原则、规则可以遵循?

我的问题与这 5 个步骤无关,这是一个纯粹的例子。

作为一个不同的例子,取文本:A751CD9E1F99。我将如何开始调查这可能意味着什么?

【问题讨论】:

  • 帖子标题应该是指密码学或加密。
  • 当人们将一个问题标记为最喜欢的问题但他们没有投票时,这让我很恼火。在少数情况下,我可以想象这是有道理的。 (实际上,我刚刚意识到,可能有很多人反对它以使其平分)
  • “Favorite”是用词不当,因为它并不一定意味着您喜欢这个问题。我经常用它来为我想关注的问题添加书签。
  • 其实 Joe,虽然不是我,但我们中的一些人使用收藏夹作为我们不想丢失的问题的文件/列表。我们不一定爱他们,我们只是想再次找到他们(有时是因为他们太有趣了)。
  • 这是有道理的。指出点,你已经成功地平息了我的挫败感:)

标签: encryption encoding reverse-engineering


【解决方案1】:

为了破解密码,密码分析员会使用他们能收集到的所有信息。攻击分为许多类别,具体取决于已知情况。一些主要的攻击,从最难到最简单,是

  • 仅密文:这是最难的攻击。分析师试图收集尽可能多的加密消息,并分析它们以寻找符号频率的模式或偏差。但是,对于良好的现代密码,没有模式。如果使用正确的密码,这是不可行的。
  • known-plaintext:让明文对应一些密文是从新密文中恢复未知明文的一大步。这是“逆向工程”真正开始的地方,因为他可以根据已知的输入和输出来测试他关于算法的假设。在第二次世界大战中,密码分析员努力建立广泛的“婴儿床”列表 - 可能出现在敌人信息中的词 - 以利用已知明文攻击。例如,某一天的天气状况或战斗的地名等都可能以加密信息的形式报告给总部。
  • 选择明文:更好的是密码分析员可以欺骗他的敌人对密码分析员创建的消息进行加密。在战时,有时会向敌人泄露虚假信息,希望对其进行加密并帮助密码分析员破解密码。
  • 自适应选择明文:这是一种已知明文的迭代方法。密码分析员可以反复让系统加密他选择的明文,并查看结果以调整他的下一次尝试。

如今,破解代码的可能方法是通过系统中的缺陷。例如,可能会使用不良的密钥管理,从而导致密钥被盗或被猜到。在其他情况下,可能会使用“旁道”攻击。例如,通过仔细测量某些加密操作所需的时间,攻击可能会猜测密钥的某些位或字节为零,从而导致通过某些算法的快速路径。

在频谱的“锡箔帽”端附近是intercept radio emissions from computing equipment. 的方法,这允许远程代理“看到”监视器上显示的内容。甚至还有专门设计的字体来尝试破坏这种窃听方式。

【讨论】:

    【解决方案2】:

    基本上,这种加密方式相当容易解密。 base64 编码将相当容易识别。 (您将只使用 64 个字符,这是 Base64 的典型特征。) 接下来是找到原始 XOR 键的步骤。这有点困难,但如果有足够的加密数据可用,有几种算法可以检测这些密钥。你的简单文本是不够的,但如果他们知道它应该变成一个十六进制字符串,事情就会变得容易得多。 然后他们确实扭转了你的其他步骤。所有这些都太容易了。

    如果可能的话,如果黑客在加密之前知道原始值,它应该能够破解。在这种情况下,与提供的字符串一样短的字符串至少足以发现您的完整加密例程,尽管您用于对字符串进行异或的密钥可能并不完全已知。

    好的,让我们尝试解密 A751CD9E1F99... 12 个字符。您似乎只使用了几个字符,因此它似乎只是一些十六进制字符串。原件必须是 6 个字符。值将在 0x51 到 0xCD 的范围内,这对于 base64 编码来说太大了。此外,由于大多数值都高于 0x7F,这表明您已经对其进行了一些编码。字典攻击已经可以对所使用的 XOR 键提供一些见解,您可以将 6 个十六进制值与大量 6 个字符的单词进行 XOR,以查看哪个返回字典中的另一个单词。似乎返回有效单词的那些可能是您用来异或原始单词的键。使用第二个加密字符串,可以再次使用那些发现的密钥,将可能的密钥集过滤成更小的集合。在现代系统上,这样的字典攻击可能会在一天内返回结果。

    大约 50 年前,这种加密方案会非常强大。如今,希望它在一天之内被任何有兴趣尝试破译它的人破解。

    我不是破解加密的专家,但我知道哪些加密方法太弱而无法使用。大约 10 年前,我参与了一个项目,该项目使用像您这样的复杂 XOR 机制将密码存储在加密文件中。然后,一位客户决定检查安全性,并让专家仅调查密码文件。他只知道一个用户名和密码,并且该用户帐户没有管理权限。但这足以让他在一小时内破解安全性,阅读有关管理员帐户的信息,然后使用该信息做任何他喜欢的事情。然后我的公司给了他一周的免费啤酒...... :-) 因此,10 年前,专家只需要一个小时。如今,他们正在相对轻松地破解更复杂的算法,仅仅是因为计算机功能更强大。如果您必须使用这种加密,那么您也可以不使用加密。这对黑客来说并不重要。

    【讨论】:

      【解决方案3】:

      如果您知道如何解密,您将能够尝试猜测算法。我可以创建许多算法,这些算法会导致某些输入为“A751CD9E1F99”。

      现在,如果您有许多可用的输入/输出,例如,您可以尝试只更改一点输入以查看输出会发生什么。良好的加密算法通常会导致较小的输入更改导致较大的输出更改。

      【讨论】:

        【解决方案4】:

        我认为您应该从阅读The Code Book 开始。您要问的是如何破解加密方法,这将使您开始了解它们是如何工作的。

        【讨论】:

          【解决方案5】:

          Rubber-hose cryptanalysis 可以很有效。

          【讨论】:

            【解决方案6】:

            您需要比这更大的文本库,并且需要了解隐窝来自特定语言/域。然后根据该语言/领域中单词的频率,可以潜在地破译文本中的某些属性。

            当然,好的密码可以解决这个问题。这种方法只能轻松破解实现不佳的密码。

            【讨论】:

              【解决方案7】:

              Ciphertext indistinguishability 是一个很好的页面,可以帮助您了解哪些加密算法旨在防止/防御。提到的攻击类型(例如 IND-CPA)也可以为您提供有关可以从什么开始的线索。

              【讨论】:

                【解决方案8】:

                攻击者可能(通常)会执行以下操作:

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

                当他们发现高熵状态时,他们会尝试获取更多的编码数据,并将它们异或在一起。如果编码确实是基于 XOR(如 RC4)并且密钥是恒定的,这会导致两个原始纯文本的 XOR-ing 与密钥被取消。如果攻击者可以获取任何纯文本编码的数据组合,则所有其他编码数据都是可解码的。

                在最后绝望时,他们可能会尝试针对最常见的做法进行测试,例如他们使用 RC4 或其他带有动态密钥的简单算法,并将密钥放在文件/数据的末尾或开头。

                如果他们只能访问编码文本,这几乎就是路的尽头。如果他们可以访问.. 像一个 API,他们可以在其中生成所提供纯文本的编码版本,那么他们将轻松识别它是基于位(如 XOR)、块密码还是前馈块密码编码,但获取密钥和实际算法仍然是一个问题。

                如果他们可以访问对称密钥编码的解码程序(如您的 XOR),或非对称密钥编码的编码程序,则很可能会立即通过反转它来破坏编码。

                【讨论】:

                  【解决方案9】:

                  如果您可以访问进行加密的黑匣子,则可以通过为其提供特定的输入值来获取大量信息。

                  举个简单的例子,如果黑匣子进行“一次性密码”式加密,如果您将其全部输入零,您将获得一次性密码。 (事实上​​,提供 any 输入值将为您提供一个带有额外 xor 的一次性 pad。)

                  请注意,即使密码系统已知(但密钥未知),良好的密码系统也能抵抗此类攻击。

                  【讨论】:

                  • 一个是指可以安全使用的次数,而不是实际使用的次数! :-)
                  【解决方案10】:

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

                  在一般情况下,更不可能(如果可能的话:))来衡量加密字符串的含义。

                  【讨论】:

                  • 这就是我的问题的重点。你将如何开始调查,四处寻找?另一个例子是如何发现一个文本是用河豚算法加密的?
                  • 这不是不可能,这是不可能的(假设密钥仅​​用于一条消息)。检查维基百科的“一次性垫”
                  • 在线查找密码分析方法。有一些蛮力和近似方法可以帮助你。至于河豚算法,如果有人知道一个文本是否被它加密,那么它就没有使用它的意义了吗?
                  • 这也假设您对纯文本一无所知(假设他加密了 jpeg 而不是文本,您可以搜索标题信息)并且还假设密钥的长度相同作为纯文本(如果密钥是 8 位(假设为 ascii 文本),那么这实际上只会作为替换密码结束)。
                  • 加密算法的理念是,只要不知道密钥,是否有人知道算法并不重要。
                  【解决方案11】:

                  呃……我会说:

                  1. Base64 解码输出。
                  2. XOR 输出与输入以获得密钥。

                  我假设由于这是一个简单的加密算法,如果您知道输入和输出,但不知道密钥,则应该很容易以这种方式反转它。

                  【讨论】:

                  • 除非我遗漏了什么,否则这听起来就像你知道算法一样——但这就是重点。你对编码算法一无所知。
                  • @JoeCool 我正在使用问题中提供给我的信息,其中包括算法的副本。我假设问题是对发布的算法进行逆向工程?
                  猜你喜欢
                  • 2011-05-09
                  • 2015-04-23
                  • 1970-01-01
                  • 2010-09-30
                  • 2014-02-22
                  • 1970-01-01
                  • 2016-04-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多