Форум сайта python.su
0
Задача - написать реализацию мд5 на питоне. Код ниже. Не работает, бралась информация с английской и русской википедий. вот англ. http://en.wikipedia.org/wiki/MD5 вот русск. https://ru.wikipedia.org/wiki/MD5
#!/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()
Офлайн
49
Офлайн
0
спасибо.
Офлайн