尝试做MD5碰撞作业问题,我不知道如何在Python中编写原始字节。我给了它一个镜头,但最后得到一个带有ASCII的.bin文件。这是我的代码:
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 31 DD 02 C5 E6 EE C4 69 3D 9A 06 98 AF F9 5C 2F CA B5
我有一个指向我的输入文件的链接,但似乎一个mod删除了它。它是一个文件,每行都有一个用ASCII写的十六进制字节。
编辑:解决了!感谢Circumflex。我有两个不同的文本文件,每个文件有128个字节的ASCII。我将它们转换为二进制文件并使用struck.pack编写它们并得到MD5碰撞。
答案 0 :(得分:4)
如果要将它们写为原始字节,可以使用pack()
类型的struct
方法。
您可以将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,然后以二进制形式(作为字节)将其打包成字符串。
你可以为输入字符串
中的每个字节循环这样的事情答案 1 :(得分: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 "0123456789abcdef".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)