我可以通过在二进制模式下检查来比较 2 个相同的加密文件吗?

信息安全 加密 Python
2021-08-31 14:40:44

我一直在努力测试相同的加密文件是否相同而不解密。我有一个提供给我的测试文件,其中包含正常数据和另一个加密版本。我需要检查通过 api 并对其进行加密的测试文件(未加密)是否与我得到的加密文件相同。这是用于检查这些文件的 python 脚本:

def compare_binaries(self,f1, f2):
    '''
    Using ittertools zip_longest to check each lines of both files
    f1 - binary file of source file
    f2- binary file of target file

    Returns True if all lines are same else False if any line is not same
    '''
    for line1, line2 in zip_longest(f1, f2, fillvalue=None):
        if line1 == line2:
            continue
        else:
            return False
    return True 

这个过程可以检查加密文件是否相同,还是有更好的选择?

4个回答

这取决于 API 如何加密文件,这里有很多可能的变体:对称(分组密码和流密码),或非对称,以及每一种的不同实现。

一些加密模式采用了一种叫做随机 IV的东西,实际上这意味着使用相同的密钥多次加密同一个文件将每次输出不同的文件。因此,即使 API 正确地加密了文件,API 的结果和您刚刚加密的文件也会有所不同。

您必须检查 API 使用的加密模式。具有确定性 IV 的 AES 可以工作(例如,使用文件的截断哈希作为 IV)。至关重要的部分是永远不要使用相同的 IV 加密两个不同的文件,否则可能会泄露密钥信息。

只有每次提交同一个文件时,API 都返回相同的输出,才有可能比较文件的哈希值。

“我一直在努力测试相同的加密文件是否相同而不解密它”

一般来说,它不会起作用。更安全的加密方案明确使用“非确定性”(实际上他们努力做到“真正随机”,而不仅仅是使用加密级别的 PRNG,通过各种方式收集熵)方法,并且永远不会加密相同的数据同样的方法两次。

有时可以添加代表文件未加密内容的(签名或未受保护的)“哈希签名”。

通常不会这样做,因为确定加密文档与已知明文相同,可以有效地“解密”文档,或确定其内容,从而破坏密码学。

因此,更强大的密码学旨在防止您想要完成的事情

如果您正在处理确定性加密,并且(例如)编写测试用例来验证加密是否有效,那么原则上这是可行的。

为了安全起见,我不会逐行检查文件(取决于平台,这可能会导致意外行为,甚至误报)。

验证大小是否相同。如果不是,它们的文件显然是不同的。

否则,逐字节比较它们,或者使用库函数来提取足够可靠的散列(sha256,但实际上,出于测试目的,MD5 通常就足够了——误报的可能性可以忽略不计)。然后您可以比较两个哈希字符串。

你没有提到加密的类型是g。有多种方法可以对加密数据进行比较,这里有一些方法;

欧洲央行

要获得平等,您可能需要使用 ECB 操作模式和 AES 等分组密码。这是不安全的,还有比这更好、更安全的方法。

哈希

哈希也可用于检查相等性。但是,这里有两个问题

  1. 哈希必须用明文计算。
  2. 散列是免费的,因此可以计算在互联网上找到的所有文件的散列,并可能决定您的一些文件。

HMAC

HMAC (hash-based message authentication code) 需要一个密钥,我们可以将其视为一个带密钥的哈希。这不存在散列的第二个问题,因为攻击者没有密钥。使用 HMAC-SHA512 将碰撞变化减少到可以忽略不计。与散列一样,HMAC-SHA512 必须应用于明文。请注意,一旦计算,比较速度非常快,因为它具有 512 位输出。

流感病毒

如果您使用 AES-GCM 对每个文件使用相同的 IV 和密钥(内部使用 CTR,这对任何流密码都有效),那么您也可以在密文上获得相等性。同样,这很危险,并且可以消除机密性,甚至更多,攻击者也可以伪造消息(这是灾难性的)。这称为随机数滥用,即 (key, nonce) 对多次使用。为了缓解这种情况,有合成 IV 模式 (SIV)。SIV 模式是 nonce 防误用的认证加密。它简单有 3 个属性;

  1. IV 用消息本身修改(需要对数据进行双重传递)
  2. 如果消息相同,则密文相等。
  3. 如果消息不同,它们很可能也不同。

因此,使用固定的随机数和密钥,您可以测试相等性。

FHE

虽然速度很慢,但可以使用完全同态加密来实现密文的相等性这将是 100% 正确的,没有误报。Microsoft使用它来安全地检查您是否被 pwned。

通过说“如何检查 2 个二进制文件是否相同?”,这个问题可能会更简单。

md5sum f1 f2

如果你得到相同的值,它们是相同的。它甚至可以帮助您检测大量文件中的重复项。