Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80

MD2 на Python

28.09.2011, 22:05. Показов 3346. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите реализовать MD2 на питоне. Нужен именно сам принцип, а не одной функцией. Вот до этого я сочинил:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import operator
 
print "First bits (for 'aaaa'): 01100001 01100001 01100001 01100001", "\n"
# STEP 1
print "STEP 1", "\n", "------"
print """Appended to 16 bytes:
01100001011000010110000101100001000011000000110000001100000011000000110000001100000011000000110000001100000011000000110000001100""", "\n"
 
# STEP 2
print "STEP 2", "\n", "------"
S = [
  41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
  98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
  30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
 190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
 169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
 128, 127,  93, 154,  90, 144,  50,  39,  53,  62, 204, 231, 191, 247, 151,   3,
 255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
  79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
  69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
  27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
  85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
  44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
 106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
 120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
 242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
  49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20]
 
def dec2bin(n, count = 8):
    return "".join([str((n >> y) & 1) for y in range(count-1, -1, -1)])
 
def bin2dec(n):
    n = str(n)
    a = 0
    for i in range(len(n)):
        a = a + int(n[len(n) - i-1]) * (2**i)
    return a
 
# Appended to 16 bytes:
row = "01100001011000010110000101100001000011000000110000001100000011000000110000001100000011000000110000001100000011000000110000001100"
print "row_old =", row
N = len(row)/8
print "N =", N, "byte(s)"
M = []
C = []
L = 0
 
for i in range(16):
    C.append(0)
 
for i in range(N):
    M.append(row[i*8:i*8+8])
print "M =", M, "\n"
 
for i in range(15):
    C[i] = 0
 
for i in range(N/16):
    for j in range(16):
        c = bin2dec(M[i*16+j])
        C[j] = dec2bin(int(operator.xor(C[j], S[operator.xor(c, bin2dec(L))])))
        L = C[j]
        M.append(str(L))
        row += str(L)
print "Added controlsumm =", C, "\n"
print "row_new =", row, "\n"
 
N1 = N + 16
 
# STEP 3
print "STEP 3", "\n", "------"
X = []
for i in range(48):
    X.append(00000000)
print "X =", X, "\n"
 
# STEP 4
print "STEP 4", "\n", "------"
# Process each 16-word block
for i in range(N1/16):
    # Copy block i into X
    for j in range(16):
        X[16+j] = M[i*16+j]
        X[32+j] = operator.xor(int(X[16+j]), X[j])
        # end of loop on j
 
    t = 0
 
    # Do 18 rounds
    for j in range(18):
        # Round j
        for k in range(48):
#           print k, " ", X[k], " ", S[t]
            t = operator.xor(int(X[k]),S[t])
            X[k] = t
            # end of loop on k
            t = operator.mod((t+j),256)
 
print "X =", X, "\n"
 
# STEP 5
print "STEP 5", "\n", "------"
md2sum_bin = ''
 
for i in range(16):
    md2sum_bin += dec2bin(X[i])
print "md2sum_bin =", md2sum_bin
 
md2sum = ''
for i in range(32):
    a = md2sum_bin[i*4:(i*4)+4]
    aa = bin2dec(a)
    aaa = hex(aa)[2:3]
    md2sum += aaa
 
print "md2sum =", md2sum
Делал как вот тут написано по шагам с теми же обозначениями. В итоге ошибок не выдаётся и что-то выщитывается, но не правельно. Может быть ошибка в самом начале в расширении байтов до числа кратного 16. Кстати да - я просто взял текст ("аааа") перевёл его в бинарный вид.. получил 4 байта.. и добавил сам еще 12. Как я понял, нужно добавлять байты со значением 12.. вот я и добавил - в конец в бинарном виде. Может тут я где-то не прав.
Если нет - где в коде не правельно.. понять не могу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2011, 22:05
Ответы с готовыми решениями:

MD2 и MD4
Добрый день ! Нужен код для подсчета MD2 и MD4 для массива байт . Заранее благодарю.

Методы шифрования MD2, MD4
Нужно написать курсач по этим методам шифрования... Перерыл кучу универских методичек, о них сказано буквально 2 слова:"они -...

Защита программ с помощью алгоритма хеширования md2
Помогите пожалуйста!Мне нужно написать прогу которая бы шифровала и розшифровывала файлы с помощью алгоритма хеширования MD 2.Подскажите...

7
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.09.2011, 10:25
открой rfc, там чаще всего есть уже готовые проги
их можно переделать на питон (или хотя бы посмотреть, к чему стремиться)
0
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
29.09.2011, 15:43  [ТС]
да.. RFC я видел.. и код на С тоже видел.. только я в нём неочень специалист. Кстати там те же самые STEP1-5 про которые я говорил и переписал на питоне.. И если в них ничего не опущено, то и я ничего не пропустил
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.09.2011, 02:53
Цитата Сообщение от Alexoy
да.. RFC я видел.. и код на С тоже видел.. только я в нём неочень специалист.
они пишут там минималистично
единственное - надо форматировать их код
rfc
там же и выравнивание, которого у тебя нет

ты функции вообще делать умеешь ?
весь код в стиле goto

Цитата Сообщение от Alexoy
Python
1
2
def dec2bin(n, count = 8):
        return "".join([str((n >> y) & 1) for y in range(count-1, -1, -1)])
эта функция зачем ?
десятичное в двоичное можно перевести встроенной функцией bin()
Python
1
2
3
4
5
>>> bin
<built-in function bin>
>>> bin(12345)[2:]
'11000000111001'
>>>
наоборот тоже
Python
1
2
3
4
5
>>> int
<type 'int'>
>>> int('11000000111001', 2)
12345
>>>
Цитата Сообщение от Alexoy
Python
1
X.append(00000000)
это что ?
0
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
30.09.2011, 14:49  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
эта функция зачем ?
Эта функция думалось, что будет выводить 8 символов (1 байт) даже если первые нули. Всё равно ведь форматировать придётся.

Цитата Сообщение от accept Посмотреть сообщение
Сообщение от Alexoy
X.append(00000000)

это что ?
а это шаг 3:
Шаг 3. Инициализация MD-буфера.
48-байтный буфер X используется для вычисления хеша. Он инициализируется нулями.

хотя наверно 8 нулей смутили, но это не ошибка.

Насчет выравнивания - я правельно его сделал хоть и руками?
Padding is performed as follows: "i" bytes of value "i" are appended to the message so that the length in bytes of the padded message becomes congruent to 0, modulo 16. At least one byte and at most 16 bytes are appended.
..я добавил к 4-ём своим байтам еще 12 со значением 00001100 (==12)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
30.09.2011, 18:33
В код особо не вглядывался. Непонятно, зачем нужны bin2dec и dec2bin. Сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env python3
 
PI_SUBST = [
    41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
    98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
    30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
    190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
    169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
    128, 127,  93, 154,  90, 144,  50,  39,  53,  62, 204, 231, 191, 247, 151,   3,
    255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
    79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
    69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
    27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
    85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
    44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
    106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
    120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
    242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
    49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20]
 
 
def md2(message_in_bytes):
    'Return digest as bytes'
    
    message = bytearray(message_in_bytes)
    
    length = len(message)
    
    # STEP 1
    padding_length = 16 - (length % 16) # the number of padding bytes
 
    # perform padding
    padded_message = message + bytearray([padding_length]) * padding_length
 
    # STEP 2
    # calculating checksum
 
    length += padding_length
    
    checksum = bytearray([0]) * 16     # clear checksum
 
    l = 0
    
    for i in range(length // 16):
 
        for j in range(16):
 
            c = padded_message[i * 16 + j]
            checksum[j] = checksum[j] ^ PI_SUBST[c ^ l]
            l = checksum[j]
 
    with_checksum = padded_message + checksum
 
    length += 16
 
    # STEP 3
    
    MD_buffer = bytearray([0]) * 48    # initialization of MD-buffer
 
    # STEP 4
 
    for i in range(length // 16):
 
        for j in range(16):
 
            MD_buffer[16 + j] = with_checksum[i * 16 + j]
            MD_buffer[32 + j] = MD_buffer[16 + j] ^ MD_buffer[j]
 
        t = 0
 
        for j in range(18):
 
            for k in range(48):
 
                t = MD_buffer[k] = MD_buffer[k] ^ PI_SUBST[t]
 
            t = (t + j) % 256
 
    # STEP 5
    return bytes(MD_buffer[:16])
 
 
def md2hex(message_in_bytes):
    'Return digest as a hex string'
    
    alphabet = '0123456789abcdef'
 
    return ''.join(map(lambda byte: alphabet[(byte >> 4) & 0xf] 
                       +            alphabet[byte & 0xf],       
                       md2(message_in_bytes)))
 
 
if __name__ == '__main__':
 
    import unittest
 
    known = {'': '8350e5a3e24c153df2275c9f80692773',
             'a': '32ec01ec4a6dac72c0ab96fb34c0b5d1',
             'abc': 'da853b0d3f88d99b30283a69e6ded6bb',
             'message digest': 'ab4f496bfb2a530b219ff33031fe06b0',
             'abcdefghijklmnopqrstuvwxyz': '4e8ddff3650292ab5a4108c3aa47940b',
             'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456':
                 '93be41820a41691a990ec0ab34275d22',
             '12345678901234567890123456789012345678901234567890123456789012345678901234567890':
                 'd5976f79d83d3a0dc9806c3c66f3efd8'}
 
    class TestMD2(unittest.TestCase):
        def testKnownValues(self):
            'test on known key-value pairs'
 
            for key in known:
                self.assertEqual(known[key], md2hex(key.encode('utf8')))
                
    unittest.main()
Обе функции принимают объект bytes, md2 возвращает bytes, md2hex - строку шестнадцатеричных значений в дефолтной кодировке.

Почему ты не сделал это в виде функции (или класса)? Если захочешь вычислить хеш для другого значения, будешь лезть в исходник?

Не по теме:

Кажись в RFC в приложении одно тестовое значение неправильное...

1
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.10.2011, 06:24
Цитата Сообщение от Nameless One
Кажись в RFC в приложении одно тестовое значение неправильное...
Code
1
2
3
4
5
6
7
8
MD2 test suite:
MD2 ("") = 8350e5a3e24c153df2275c9f80692773
MD2 ("a") = 32ec01ec4a6dac72c0ab96fb34c0b5d1
MD2 ("abc") = da853b0d3f88d99b30283a69e6ded6bb
MD2 ("message digest") = ab4f496bfb2a530b219ff33031fe06b0
MD2 ("abcdefghijklmnopqrstuvwxyz") = 4e8ddff3650292ab5a4108c3aa47940b
MD2 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = da33def2a42df13975352846c30338cd
MD2 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = d5976f79d83d3a0dc9806c3c66f3efd8
проверил
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> import Crypto.Hash.MD2
>>> tup = (
... "",
... "a",
... "abc",
... "message digest",
... "abcdefghijklmnopqrstuvwxyz",
... "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
... "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
... )
>>> 
>>> for s in tup:
...     print Crypto.Hash.MD2.new(s).hexdigest()
... 
8350e5a3e24c153df2275c9f80692773
32ec01ec4a6dac72c0ab96fb34c0b5d1
da853b0d3f88d99b30283a69e6ded6bb
ab4f496bfb2a530b219ff33031fe06b0
4e8ddff3650292ab5a4108c3aa47940b
da33def2a42df13975352846c30338cd
d5976f79d83d3a0dc9806c3c66f3efd8
>>>


у тебя там 0123456
1
01.10.2011, 09:01

Не по теме:

Цитата Сообщение от accept Посмотреть сообщение
у тебя там 0123456
Скопировал неправильно :wall:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2011, 09:01
Помогаю со студенческими работами здесь

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации? Внедрения в систему? Добавлено через 10 минут Хочу...

Software Developer Python/Data or ready to improve Python (Санкт-Петербург)
We are looking for experienced server-side developers who are interested in improving their skills and knowledge in Python and ETL/Data. We...

Запуск скрипта написанного на python на windows, где не установлен python
Не запускается скрипт на Windows, где не установлен python. Команда в коде на выполнение написана так: def Adminnewpriglash(): ...

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код setup.py from cx_Freeze import setup, Executable import os ...

Maching pursuit. Согласованный поиск на Python. Требуется сам алгоритм, написанный на Python
Требуется сам алгоритм, написанный на Python. Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru