0

我使用 1 字节密钥和 XOR 加密通过下面的代码加密了文件。

blocksize=256

while (args.secretkey.tell() < blocksize):
generates once?
    sys.stdout.write('.')
    args.secretkey.write(os.urandom(1))

counter=0
args.secretkey.seek(0)
keydata = args.secretkey.read(blocksize)

while 1:
    byte = args.infile.read(1)
    if not byte:
        break
    args.outfile.write(chr(ord(keydata[counter % len(keydata)]) ^ ord(byte)))
    counter+=1

如何找到正确的密钥来解密文件?我必须经过 256 种组合才能获得正确的密钥吗?

4

2 回答 2

1

这里有解码程序(编码是对随机生成数据的异或,所以解码是做同样的异或):

#!/usr/bin/python
import os
import sys
import argparse

blocksize=256

parser = argparse.ArgumentParser(description="Custom encryption algorithm because a friend said that's the way to do it. Anyway, it's called 'Only This Program' since I'm pretty sure that only this program can securely decrypt the files as long as you don't give out your secret.dat file created when you encrypt something.")
parser.add_argument('--infile', metavar='i', nargs='?', type=argparse.FileType('r'), help='input file, defaults to standard in', default=sys.stdin)
parser.add_argument('--outfile', metavar='o', nargs='?', type=argparse.FileType('wb'), help='output file, defaults to standard out', default=sys.stdout)
parser.add_argument('--secretkey', metavar='s', nargs='?', type=argparse.FileType('r'), help='input file, defaults to secretkey.dat', default='secretkey.dat')

args = parser.parse_args()

counter=0
args.secretkey.seek(0)
keydata = args.secretkey.read(blocksize)

while 1:
    byte = args.infile.read(1)
    if not byte:
        break
    args.outfile.write(chr(ord(keydata[counter % len(keydata)]) ^ ord(byte)))
    counter+=1

sys.stderr.write('\nSecret keyfile: %s\nInput file: %s\nOutput file: %s\nTotal bytes: %d \n' % (args.secretkey.name, args.infile.name, args.outfile.name, counter))
于 2013-09-20T07:18:57.700 回答
1

要反转加密,您需要 256 字节的随机密钥。但是,如果您丢失了它,xor 加密非常弱,以至于如果您对某些加密文件有所了解,您可以稍微耐心地对其进行逆向工程。

为了说明,我们假设您有几个您知道包含英文文本的文件;不过,同样的原则也适用于许多其他类型的内容。理想情况下,您需要几百个可预测的文本块。

  1. 首先,请注意,每 256 个字节使用相同的“秘密”字节进行编码;因此,您可以从不同的文本文件中收集大量字节,这些字节与相同的密钥字节(例如,密钥的字节 0)进行了异或。

  2. 您现在可以计算编码字节的频率并将它们与英文文本的频率表进行匹配。

  3. 假设最频繁的字节是0xAB; 好吧,在英文文本中,最常见的字节是空格(0x20);它的频率几乎是下一个最常见字节 ( ) 的两倍e,因此如果您正在查看文本文件,则很难出错。所以,只要解决这个小方程0x20 ^ x = 0xAB恭喜,您已经从丢失的密钥中恢复了一个字节。再重复 255 次。

如果您以某种方式错误地计算了一个字节,请不要担心;一旦您拥有整个密钥,解码文本中的错误就会很明显,您将能够返回并修复相应的密钥字节。

于 2013-11-05T20:36:14.413 回答