繁体   English   中英

在python中反转os.urandom

[英]Reverse os.urandom in python

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

提前致谢

在这里你有解码程序(编码是对随机生成的数据的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))

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

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

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

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

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

如果以某种方式计算出错误的字节,请不要担心; 一旦你拥有了整个密钥,解码后的文本中的错误将是显而易见的,你将能够返回并修复相应的密钥字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM