2011-09-30 39 views
3

试图做一个MD5碰撞作业问题,我不知道如何在Python中编写原始字节。我给了它一个镜头,但最后只有一个带有ASCII的.bin文件。这是我的代码:如何将ASCII字节的文件写入二进制文件作为实际字节?

fileWriteObject1 = open("md5One.bin", 'wb') 
fileWriteObject2 = open("md5Two.bin", 'wb') 
fileReadObject1 = open('bytes1.txt', 'r') 
fileReadObject2 = open('bytes2.txt', 'r') 

bytes1Contents = fileReadObject1.readlines() 
bytes2Contents = fileReadObject2.readlines() 

fileReadObject1.close() 
fileReadObject2.close() 


for bytes in bytes1Contents: 
    toWrite = r"\x" + bytes 
    fileWriteObject1.write(toWrite.strip()) 

for bytes in bytes2Contents: 
    toWrite = r"\x" + bytes 
    fileWriteObject2.write((toWrite.strip()) 

fileWriteObject1.close() 
fileWriteObject2.close() 

样本输入: D1 DD C5 E6 EE C4 3D 9A AF F9 5C 2F CA b5

我有一个链接到我的输入文件,但它似乎是一个国防部删除它。这是一个在每行上都有一个用ASCII字符写的十六进制字节的文件。

编辑:求助!感谢Circumflex。

我有两个不同的文本文件,每个都有128字节的ASCII。我将它们转换为二进制文件,并使用struck.pack编写并获得了MD5冲突。

+2

什么是您的输入实际上是什么样子? (技术上没有“ASCII字节”这样的东西,但是有很多方法可以用ASCII字符来表示任意字节,你应该指定你在说什么) –

+0

我有一个链接到我的输入文件,但它似乎是一个mod删除它。这是一个在每行上都有一个用ASCII字符写的十六进制字节的文件。 – anon58192932

+1

因此,您需要将每对字符转换为一个字节,然后将其写入文件。要开始,请尝试'int(“d1”,base = 16)'。 –

回答

4

如果要将它们写入为原始字节,则可以使用struct类型的pack()方法。

你可以写出来MD5为2长长整型,但你必须把它写在2个8个字节的部分

http://docs.python.org/library/struct.html

编辑:

一个例子:

import struct 

bytes = "6F" 
byteAsInt = int(bytes, 16) 
packedString = struct.pack('B', byteAsInt) 

如果我有这个权利,你试图拉入一些文本与十六进制字符串写入,将它们转换为二进制格式并输出它们?如果是这种情况,该代码应该做你想做的。

它基本上将原始的十六进制字符串转换为一个int,然后将其以二进制形式(作为字节)打包到一个字符串中。

你可以循环遍历输入字符串

+0

你有可能以我的方式举个例子吗?我不确定格式化字符。这些文档对我来说没有多大意义。 – anon58192932

+0

当然,我已经给我的答案添加了一个例子:) – Circumflex

+0

这看起来很完美。我也在研究binascii包,它使用:binascii.a2b_hex('ee'),但它返回一个与字符串类不兼容的缓冲区,所以不知道如何保存或写入结果。 – anon58192932

0
>>> import binascii 
>>> binary = binascii.unhexlify("d131dd02c5") 
>>> binary 
'\xd11\xdd\x02\xc5' 

binascii.unhexlify()这样的事情,每个字节在binascii.c定义。下面是Python中的“接近C”的实施:

def binascii_unhexlify(ascii_string_with_hex): 
    arglen = len(ascii_string_with_hex) 
    if arglen % 2 != 0: 
     raise TypeError("Odd-length string") 

    retval = bytearray(arglen//2) 
    for j, i in enumerate(xrange(0, arglen, 2)): 
     top = to_int(ascii_string_with_hex[i]) 
     bot = to_int(ascii_string_with_hex[i+1]) 
     if top == -1 or bot == -1: 
      raise TypeError("Non-hexadecimal digit found") 
     retval[j] = (top << 4) + bot 

    return bytes(retval) 

def to_int(c): 
    assert len(c) == 1 
    return "abcdef".find(c.lower()) 

如果没有binascii.unhexlify()bytearray.fromhex()str.decode('hex')或类似的,你可以如下写:

def unhexlify(s, table={"%02x" % i: chr(i) for i in range(0x100)}): 
    if len(s) % 2 != 0: 
     raise TypeError("Odd-length string") 
    try: 
     return ''.join(table[top+bot] for top, bot in zip(*[iter(s.lower())]*2)) 
    except KeyError, e: 
     raise TypeError("Non-hexadecimal digit found: %s" % e) 
相关问题