我需要解密一个 png 文件。我无法打开/查看图像,因为它已加密。当我在命令行中对图像运行文件命令时,它说它是“数据”类型。
我知道图像是使用 XOR 加密的(如一次性填充的情况),使用我不知道的密钥。
我只有图像文件,没有其他信息。我应该如何找出密钥?
我需要解密一个 png 文件。我无法打开/查看图像,因为它已加密。当我在命令行中对图像运行文件命令时,它说它是“数据”类型。
我知道图像是使用 XOR 加密的(如一次性填充的情况),使用我不知道的密钥。
我只有图像文件,没有其他信息。我应该如何找出密钥?
您还必须知道一次性便笺簿是否与原始图像一样长。如果焊盘更短,那么它将重复直到明文结束。如果它是 1 到 7 字节长,那真的很容易,因为 PNG 文件格式的前 8 个字节是已知的:\x89PNG\r\n\x1a\n
.
计算key = ciphertext[0] ^ '\x89'
。如果key ^ ciphertext[1] == 'P'
那时你有你的钥匙。否则,您需要检查key ^ ciphertext[i] == knownHeader[i]
2i
到 8 以查看是否有密钥的开头。根据i
您找到匹配项的位置,您知道垫子有多长。之后,您可以计算剩余的密钥字节。
唯一剩下的就是使用整个密钥来解密整个文件并检查它是否合理。
对随机比特流进行异或将导致实际上是随机输出,因为每个比特以 0.5 的概率变化(参见 Shannon,1949 年)。如果您既没有密钥也没有映像,则无法恢复映像或密钥本身。
如果这是某种挑战,您可以尝试使用 XOR 的属性来发挥自己的优势。例如,如果有另一个图像与相同的密钥进行异或,并且您拥有该图像明文并加密,您显然可以通过将未加密的图像与加密的图像进行异或来找到密钥。或者,例如,您可以尝试猜测由于某种原因在您的上下文中显而易见的键。
如果密钥是真正随机的,并且与输入具有相同的长度,那么一次性键盘具有所有出色的功能。例如,您的密钥可能较短且重复。
您可以利用的一件事是图像文件具有已知格式,因此如果您知道它应该是什么格式,您可以找出相当多的密钥。一开始有一个神奇的数字来识别文件格式,然后根据实际的图像类型,一些字段只有很少或只有一个潜在值。让我们将它们填入正在构建的密钥中,看看是否有模式。但同样,如果密钥是真正随机的,从不重复使用,并且只要图像,就不可能恢复图像文件。