2011-09-30 75 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) 
相關問題