Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2015 23:17:58

Maxim3500
Зарегистрирован: 2014-10-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация md5. Исправить код.

Задача - написать реализацию мд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()

Офлайн

#2 Янв. 30, 2015 12:02:14

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Реализация md5. Исправить код.

Офлайн

#3 Янв. 31, 2015 11:16:55

Maxim3500
Зарегистрирован: 2014-10-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация md5. Исправить код.

спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version