First obvious error: K = [math.floor(math.pow(2, 32) * math.fabs(math.sin(i + 1))) for i in range(63)] The pseudo-code is using inclusive bounds notation; `range` is exclusive on the upper bound, so you just made a `K` that is 63 elements long, when it's supposed to be 64 elements long. Same issue with your final loop: for i in range(63): Probably ought to check your other bounds to make sure you haven't made similar errors elsewhere. For your final question, to explain "break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15", "32 bit words" means "integers comprised of 32 binary bits". For a simple example, breaking `0b100100001111` into three four bit words would produce `0b1001, 0b0000, 0b1111`. Unfortunately for you, in Python, `int`s are infinite precision; they don't drop overflowing bits when a computation produces a result with more than 32 bits, and MD5 calculations assume they do. So you're going to need to simulate it with a lot of masking, by bitwise and-ing via `& 0xffffffff`.