1

I have a file hashed to a standard md5 Hash

Correction: OpenSSL Hashes are HEXDECIMAL representations.

MD5 Hash:   57ED2E029BF9CA39383D2A671EF4FB50

I have a program that requires a byte encoding base64 md5 hash.

MD5 BASE64 byte: 8se7isyX+S6Yei1Ah9AhsQ==

How do you use pythons 'binascii' b2a methods to convert the standard MD5 hash to a Base64?

The below is wrong.

import binascii 
bin = binascii.a2b_uu('57ED2E029BF9CA39383D2A671EF4FB50')
base = binascii.b2a_base64(bin) 

Output +> 'QUlZTlYUmikRYUjRXkQjWQkiiSkmkhZmVjhZkWTAAAAA\n'

TL;DR:

I need to take hexstring, convert it to binary, and then base64 the binary.. what's the python way?

Reference:

Community
  • 1
  • 1
shadowbq
  • 1,232
  • 1
  • 16
  • 29
  • how do you you hash the file? – Sven Dec 09 '14 at 16:30
  • openssl md5 file.exe – shadowbq Dec 09 '14 at 17:03
  • The other one is a byte representation of the md5 string encoded to base64 rather than ascii – shadowbq Dec 09 '14 at 17:05
  • 1
    You can convert a hexadecimal number in a string to a binary value with `int('57ED2E029BF9CA39383D2A671EF4FB50', base=16)`. – martineau Dec 09 '14 at 18:15
  • >>> hashlib.md5(open("file.exe").read()).hexdigest() '4bd2f7940a1ec86efe1d1178b4cb23b7' – shadowbq Dec 09 '14 at 18:44
  • Are you really calling `binascii.a2b_uu` rather than `binascii.a2b_hex`? The former gives an error about "Trailing Garbage" when I try it with your example hex string, and it's wrong anyway ([Uuencode](http://en.wikipedia.org/wiki/Uuencoding) is not the same thing as hex encoding). When I properly decode your hex string and re-encode it to base64, I get `b'V+0uApv5yjk4PSpnHvT7UA==\n'`. – Blckknght Dec 09 '14 at 19:36
  • @martineau that generates a single integer rather than a string of bytes. – Mark Ransom Dec 09 '14 at 20:40

2 Answers2

1

The most important thing to realize was that the openssl md5 hash is calculated the same way as the hashlib.md5(..).hexdigest() method

import base64
import hashlib    
hex_hash = hashlib.md5(open("putty_upx.exe").read()).hexdigest()
>> '4bd2f7940a1ec86efe1d1178b4cb23b7'
hex_hash.decode("hex")
>> 'K\xd2\xf7\x94\n\x1e\xc8n\xfe\x1d\x11x\xb4\xcb#\xb7'    
b64_md5_hash = base64.b64encode(hex_hash.decode("hex"))
>> 'S9L3lAoeyG7+HRF4tMsjtw=='
len(b64_md5_hash)
>> 24 
shadowbq
  • 1,232
  • 1
  • 16
  • 29
1

Here's how you can do the conversion with binascii. It requires two conversions, one from hex to binary and another from binary to base64.

>>> hex_hash = '4bd2f7940a1ec86efe1d1178b4cb23b7'
>>> binascii.b2a_base64(binascii.a2b_hex(hex_hash))
'S9L3lAoeyG7+HRF4tMsjtw==\n'
Mark Ransom
  • 299,747
  • 42
  • 398
  • 622