2011-09-30 2 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() 

샘플 입력 : DD C5 E6 EE C4 차원 9A AF F9 5C 2 층 캘리포니아 (D1) b5

내 입력 파일에 대한 링크가 있지만 MOD가 제거한 것 같습니다. 이것은 각 행에 ASCII로 쓰여진 16 진수 바이트가있는 파일입니다.

EDIT : SOLVED! Circumflex에게 감사드립니다.

나는 각각 128 바이트의 ASCII를 가진 두 개의 서로 다른 텍스트 파일을 가지고있다. 필자는 바이너리로 변환하여 struck.pack을 사용하여 썼고 MD5 충돌이 발생했습니다.

+2

무엇 귀하의 의견이 실제로 모습입니까? (기술적으로 "ASCII 바이트"와 같은 것은 없지만, ASCII 문자를 사용하여 임의의 바이트를 표현할 수있는 방법이 많이 있습니다. 어떤 문자를 지정해야합니다) –

+0

입력 파일에 대한 링크가 있지만 mod 그것을 제거했다. 이것은 각 행에 ASCII로 쓰여진 16 진수 바이트가있는 파일입니다. – anon58192932

+1

그래서 각 쌍의 문자를 1 바이트로 변환하여 파일에 기록해야합니다. 시작하려면'int ("d1", base = 16)'을 사용해보십시오. –

답변

4

원시 바이트로 쓰고 싶다면, 메서드를 struct 유형으로 사용할 수 있습니다.

당신이 오래 오래 int 치의 밖으로 MD5를 작성할 수 있지만, 2 ~ 8 바이트 섹션

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

편집에 작성해야 할 것 :

예 :

import struct 

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

이 권리가 있다면, 작성된 16 진수 문자열로 텍스트를 가져 와서 이진 형식으로 변환하여 출력하려고합니다. 그렇다면 코드가 원하는 것을 수행해야합니다.

기본적으로 원시 16 진수 문자열을 int로 변환 한 다음 이진 형식 (바이트)으로 문자열로 압축합니다. 당신은 입력 문자열

+0

혹시라도 저에게 모범을 보이면 어떨까요? 서식 지정 문자가 확실하지 않습니다. 그 문서는 나에게별로 의미가 없다. – anon58192932

+0

물론, 나는 나의 대답에 예제를 추가했다 :) – Circumflex

+0

이것은 완벽 해 보인다. 나는 또한 binascii 패키지를 사용하여 binascii.a2b_hex ('ee')를 연구했지만 string 클래스와 호환되지 않는 버퍼를 리턴하므로 결과를 저장하거나 작성하는 방법을 모르겠습니다. – anon58192932

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

binascii.unhexlify()의 각 바이트에 대해이 같은 이상 반복 할 수

binascii.c에 정의되어 있습니다. 다음은 파이썬에서 "가까운 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)