在python中反转os.urandom

时间:2013-09-20 06:49:22

标签: python python-2.7

我使用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种组合来获得正确的密钥吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

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

#!/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))

答案 1 :(得分:1)

要反转加密,您需要256字节的随机密钥。但是如果你丢失了它,那么xor加密是如此之弱,如果你知道某些关于你的某些加密文件,你可以用一点耐心对它进行逆向工程

对于博览会,我们假设你有几个你知道包含英文文本的文件;但是,相同的原则适用于许多其他类型的内容。理想情况下,您需要几百块可预测的文本。

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

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

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

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