i cannot find the mistake i made with this code. i have tried many different ways to create ripemd160, but they either don't work or give me wrong outputs.

what did i do wrong?

#     makehex() = change the value into a 8 hex char string
#     ROL i got from another code, and I know it works
#     little_end() = move each byte (2 hex chars) to the other end of the string

def F(x,y,z,round):
	if round<16:
		return x ^ y ^ z
	elif 16<=round<32:
		return (x & y) | (~x & z)
	elif 32<=round<48:
		return (x | ~y) ^ z
	elif 48<=round<64:
		return (x & z) | (y & ~z)
	elif 64<=round:
		return x ^ (y | ~z)

def RIPEMD160(data):
# the constants (r, rr, s, ss) should be right. i copied them right off of the original paper and checked them with other codes, and i dont think i found any errors
# i know the padding is correct. i copied it from my md4 program, which is also correct

# its most likely that something here is wrong
	for i in range(number of blocks of 512 bits):

                # single chars are the first round, double is the parallel round 
		a = aa = h0; b = bb = h1; c = cc = h2; d = dd = h3; e = ee = h4
		X = data[512*i:512*(i+1)]
		X = [int(X[32*x:32*(x+1)],2) for x in range(16)]

		for j in range(80):
			T = (a+ ROL( (F(b, c, d, j) + X[r[j]] + k[j/16])%2**32,s[j])+e)%2**32
			a = e; e = d; d = ROL(c, 10); c = b; a = T
			T = (aa+ ROL( (F(bb,cc,dd,79-j) + X[rr[j]] + kk[j/16] )%2**32,ss[j])+ee)%2**32
			aa = ee; ee = dd; dd = ROL(cc,10); cc = bb; aa = T

		T  = (h1+c+dd)%2**32
		h1 = (h2+d+ee)%2**32
		h2 = (h3+e+aa)%2**32
		h3 = (h4+a+bb)%2**32
		h4 = (h0+b+cc)%2**32
		h0 = T

	return little_end(makehex(h0))+little_end(makehex(h1))+little_end(makehex(h2))+little_end(makehex(h3))+little_end(makehex(h4))

Recommended Answers

All 3 Replies

i meant

T = (ROL((a + F(b, c, d, j) + X[r[j]] + k[j/16])%2**32, s[j]) + e)%2**32
a = e; e = d; d = ROL(c, 10); c = b; a = T
T = (ROL((aa + F(bb, cc, dd, 79-j) + X[rr[j]] + kk[j/16] )%2**32, ss[j]) + ee)%2**32
aa = ee; ee = dd; dd = ROL(cc,10); cc = bb; aa = T

but the ouput barely changed

for i in range(number of blocks of 512 bits): looks like pseudo code.

yeah. that (hopefully) makes it easier to understand. and i still havent figured it out

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.