md5 python实现_MD5 Python实现

我希望了解更多关于哈希算法,特别是消息摘要5算法。特别是在Python(3+)的更新版本中

我知道您可以完成整个from hashlib import md5的工作,而且在Python中的实现可以在线找到。但是,我发现最新的一个模仿原始C代码的版本只能在Python2.4.X中运行,而且还有一个3.2版本非常简洁,完全不是我想要的(http://rosettacode.org/wiki/MD5/Implementation)

在花了几个小时从JavaScript转换到python3.5之后,无论我多么努力,我都无法正确地实现它,得到的哈希值总是与来自hashlib模块本身的哈希值不同。有人能帮我吗?在

编辑:

这是我正在转换的JavaScript实现:

How does MD5Sum algorithm work?

这个实现是可行的,我已经使用w3的在线工具验证了它学校网有。在

这是我当前的代码(仍然不起作用),问题很明显是在按位操作中,主要的哈希函数不是问题,因为我直接从JavaScript版本复制粘贴而成def newArray(num):

array=[]

for x in range(num):

array.append(0)

return array

def convertToWordArray(string):

#print(string)

lMessageLength=len(string)

#print(lMessageLength)

lNumberOfWords_temp1=lMessageLength+8

#print(lNumberOfWords_temp1)

lNumberOfWords_temp2=int((lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64)

#print(lNumberOfWords_temp2)

lNumberOfWords=(lNumberOfWords_temp2+1)*16

#print(lNumberOfWords)

lWordArray=newArray(lNumberOfWords-1)

lBytePosition=0

lByteCount=0

while lByteCount

lWordCount=int((lByteCount-(lByteCount%4))/4)

lBytePosition=(lByteCount%4)*8

#print(string[int(lByteCount)])

lWordArray[lWordCount]=(lWordArray[lWordCount]|(ord(string[int(lByteCount)])<

lByteCount+=1

lWordCount=int((lByteCount-(lByteCount%4))/4)

lBytePosition=(lByteCount%4)*8

lWordArray[lWordCount]=lWordArray[lWordCount]|(0x80<

lWordArray[lNumberOfWords-2]=lMessageLength<<3

lWordArray.append(lMessageLength>>29)

return lWordArray

def F(x,y,z):

return (x & y)|((~x) & z)

def G(x,y,z):

return (x & z)|(y & (~z))

def H(x,y,z):

return (x ^ y ^ z)

def I(x,y,z):

return (y ^ (x|(~z)))

def C(q,a,b,x,s,ac):

return addu(rol(addu(addu(a,q),addu(x,ac)),s),b)

def FF(a,b,c,d,x,s,ac):

return C((b & c)|((~b) & d),a,b,x,s,ac)

def GG(a,b,c,d,x,s,ac):

return C((b & d)|(c & (~d)),a,b,x,s,ac)

def HH(a,b,c,d,x,s,ac):

return C(b ^ c ^ d,a,b,x,s,ac)

def II(a,b,c,d,x,s,ac):

return C(c ^ (b|(~d)),a,b,x,s,ac)

def addu(x,y):

ls=(x & 0xFFFF)+(y & 0xFFFF)

return (((x>>16)+(y>>16)+(ls>>16))<<16)|(ls & 0xFFFF)

def rol(v,s):

return (v<>(32-s))

def wordToHex(lValue):

wordToHexValue=''

wordToHexValue_temp=''

for lCount in range(4):

lByte=(lValue>>(lCount*8)) & 255

wordToHexValue_temp="0"+format(lByte, 'x')

wordToHexValue=wordToHexValue+wordToHexValue_temp[-2:]

return wordToHexValue

def md5hash(message):

x=convertToWordArray(message)

a=0x67452301

b=0xEFCDAB89

c=0x98BADCFE

d=0x10325476

xl=len(x)

j=0

while j

aa=a

bb=b

cc=c

dd=d

a=FF(a,b,c,d, x[j+0], 7,0xD76AA478)

d=FF(d,a,b,c, x[j+1],12,0xE8C7B756)

c=FF(c,d,a,b, x[j+2],17,0x242070DB)

b=FF(b,c,d,a, x[j+3],22,0xC1BDCEEE)

a=FF(a,b,c,d, x[j+4], 7,0xF57C0FAF)

d=FF(d,a,b,c, x[j+5],12,0x4787C62A)

c=FF(c,d,a,b, x[j+6],17,0xA8304613)

b=FF(b,c,d,a, x[j+7],22,0xFD469501)

a=FF(a,b,c,d, x[j+8], 7,0x698098D8)

d=FF(d,a,b,c, x[j+9],12,0x8B44F7AF)

c=FF(c,d,a,b,x[j+10],17,0xFFFF5BB1)

b=FF(b,c,d,a,x[j+11],22,0x895CD7BE)

a=FF(a,b,c,d,x[j+12], 7,0x6B901122)

d=FF(d,a,b,c,x[j+13],12,0xFD987193)

c=FF(c,d,a,b,x[j+14],17,0xA679438E)

b=FF(b,c,d,a,x[j+15],22,0x49B40821)

a=GG(a,b,c,d, x[j+1], 5,0xF61E2562)

d=GG(d,a,b,c, x[j+6], 9,0xC040B340)

c=GG(c,d,a,b,x[j+11],14,0x265E5A51)

b=GG(b,c,d,a, x[j+0],20,0xE9B6C7AA)

a=GG(a,b,c,d, x[j+5], 5,0xD62F105D)

d=GG(d,a,b,c,x[j+10], 9,0x2441453)

c=GG(c,d,a,b,x[j+15],14,0xD8A1E681)

b=GG(b,c,d,a, x[j+4],20,0xE7D3FBC8)

a=GG(a,b,c,d, x[j+9], 5,0x21E1CDE6)

d=GG(d,a,b,c,x[j+14], 9,0xC33707D6)

c=GG(c,d,a,b, x[j+3],14,0xF4D50D87)

b=GG(b,c,d,a, x[j+8],20,0x455A14ED)

a=GG(a,b,c,d,x[j+13], 5,0xA9E3E905)

d=GG(d,a,b,c, x[j+2], 9,0xFCEFA3F8)

c=GG(c,d,a,b, x[j+7],14,0x676F02D9)

b=GG(b,c,d,a,x[j+12],20,0x8D2A4C8A)

a=HH(a,b,c,d, x[j+5], 4,0xFFFA3942)

d=HH(d,a,b,c, x[j+8],11,0x8771F681)

c=HH(c,d,a,b,x[j+11],16,0x6D9D6122)

b=HH(b,c,d,a,x[j+14],23,0xFDE5380C)

a=HH(a,b,c,d, x[j+1], 4,0xA4BEEA44)

d=HH(d,a,b,c, x[j+4],11,0x4BDECFA9)

c=HH(c,d,a,b, x[j+7],16,0xF6BB4B60)

b=HH(b,c,d,a,x[j+10],23,0xBEBFBC70)

a=HH(a,b,c,d,x[j+13], 4,0x289B7EC6)

d=HH(d,a,b,c, x[j+0],11,0xEAA127FA)

c=HH(c,d,a,b, x[j+3],16,0xD4EF3085)

b=HH(b,c,d,a, x[j+6],23,0x4881D05)

a=HH(a,b,c,d, x[j+9], 4,0xD9D4D039)

d=HH(d,a,b,c,x[j+12],11,0xE6DB99E5)

c=HH(c,d,a,b,x[j+15],16,0x1FA27CF8)

b=HH(b,c,d,a, x[j+2],23,0xC4AC5665)

a=II(a,b,c,d, x[j+0], 6,0xF4292244)

d=II(d,a,b,c, x[j+7],10,0x432AFF97)

c=II(c,d,a,b,x[j+14],15,0xAB9423A7)

b=II(b,c,d,a, x[j+5],21,0xFC93A039)

a=II(a,b,c,d,x[j+12], 6,0x655B59C3)

d=II(d,a,b,c, x[j+3],10,0x8F0CCC92)

c=II(c,d,a,b,x[j+10],15,0xFFEFF47D)

b=II(b,c,d,a, x[j+1],21,0x85845DD1)

a=II(a,b,c,d, x[j+8], 6,0x6FA87E4F)

d=II(d,a,b,c,x[j+15],10,0xFE2CE6E0)

c=II(c,d,a,b, x[j+6],15,0xA3014314)

b=II(b,c,d,a,x[j+13],21,0x4E0811A1)

a=II(a,b,c,d, x[j+4], 6,0xF7537E82)

d=II(d,a,b,c,x[j+11],10,0xBD3AF235)

c=II(c,d,a,b, x[j+2],15,0x2AD7D2BB)

b=II(b,c,d,a, x[j+9],21,0xEB86D391)

a=addu(a,aa)

b=addu(b,bb)

c=addu(c,cc)

d=addu(d,dd)

j+=16

return (wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d)).lower()

你可能感兴趣的:(md5,python实现)