Задача - написать реализацию мд5 на питоне. Код ниже. Не работает, бралась информация с английской и русской википедий. вот англ.
вот русск.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Note: All variables are unsigned 32 bit & wrap modulo 2^32 when calculating
from math import sin, floor
message = 'hello'
s, K = [], []
# сложение по модулю 32, замечание в начале,
def add32(x, c):
x, c = int(x) , int(c)
return (x+c)&0xFFFFFFFF
def leftrotate(x, c):
x, c = int(x) , int(c)
tmp1 = (x << c)
tmp2 = (x >> (32 - c))
return (tmp1|tmp2)&0xFFFFFFFF
# s specifies the per-round shift amounts
s += [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22]
s += [5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20]
s += [4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23]
s += [6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]
# Use binary integer part of the sines of integers (Radians) as constants:
for x in range(64):
K.append(floor(abs(sin(x + 1)) * (2**32)))
# Initialize variables:
a0 = 0x67452301
b0 = 0xefcdab89
c0 = 0x98badcfe
d0 = 0x10325476
# хешируемое сообщение в двоичной форме
bit_mess = ''.join([bin(ord(x))[2:] for x in message])
# длина последнего кусочка
len1 = len(bit_mess) % 512
len_to_append = bin(len(bit_mess) % 2**64)[2:].rjust(64, '0')
bit_mess = '{0}1{1}{2}'.format(
bit_mess, (512 - 1 - 64 - len1) * '0', len_to_append)
# разбиваем хешируемое сообщение на куски по 512 ( а эти куски по 32 ) бита.
# в результате будет список списоков
list_mess = []
for x in range(len(bit_mess) / 512):
tmp_list = []
for j in xrange(16):
tmp_list.append(int(str(bit_mess[x:][j * 32:(j + 1) * 32]), 2))
list_mess.append(tmp_list)
# далее алгоритм целиком и полностью взят с англ. википедии
for chunk512 in list_mess:
A = a0
B = b0
C = c0
D = d0
for i in range(64):
if 0 <= i <= 15:
F = (B & C) | ((~ B) & D)
g = i
elif 16 <= i <= 31:
F = (D & B) | ((~D) & C)
g = (5 * i + 1) % 16
elif 32 <= i <= 47:
F = B ^ C ^ D
g = (3 * i + 5) % 16
elif 48 <= i <= 63:
F = C ^ (B | (~ D))
g = (7 * i) % 16
dTemp = D
D = C
C = B
# отступление от википедии, ибо все нужно складывать специальным образом
tmp1 = add32(A, F)
tmp2 = add32(K[i], chunk512[g])
tmp1 = add32(tmp1, tmp2)
B = add32(B, leftrotate(tmp1, s[i]))
A = dTemp
a0 = add32(a0, A)
b0 = add32(b0, B)
c0 = add32(c0, C)
d0 = add32(d0, D)
print '{0:x}{1:x}{2:x}{3:x}'.format(a0, b0,c0, d0)
# с надеждой проверяем
import hashlib
m = hashlib.md5()
m.update('hello')
print m.hexdigest()