MD2 (англ. Message Digest Algorithm) — хеш-функція, розроблена Рональдом Ріверстом (RSA Laboratories) в 1989 році і описана RFC 1319 (оновлено від RFC 1115). Розмір хешу — 128 біт (16 байт). Всі операції алгоритму виконуються з октетами (байтами).
Загальні | |
---|---|
Уперше оприлюднений | 2008 |
Серія | MD2, MD4, MD5, MD6 |
Деталі | |
Розмір даджеста | 128 біт |
Раундів | 18 |
Хоча алгоритм все ще повністю не було зламано, в 2011 IETF змінило його статус на "історичний" і натомість рекомендує використовувати SHA-256 чи інші сильні алгоритми.
Опис алгоритму
Спочатку повідомлення доповнюють так, щоб його довжина в байтах була кратна 16. Для цього додають до кінця повідомлення (від 1 до 16-ти) байтів кожен з яких містить значення . Повідомлення матиме довжину , таку що . позначатиме доповнене повідомлення.
На другому кроці додають чексуму , використовуючи "випадкову" перестановку з 256 байт, побудовану з цифр числа Пі, . Для цього робиться наступне:
для і := від 0 до 15: C[i] := 0 L := 0 для і := від 0 до N/16-1: // для кожного блоку по 16 байт для j від 0 до 15: c := M[i*16+j] // символ в блоці L := C[j] := C[j] xor S[c xor L] // оновлюємо чексуму
В описі цього кроку RFC містить помилку (виправлену в Errata 555), замість L = C[j] = C[j] xor S[c xor L]
там роблять присвоєння L = C[j] = S[c xor L]
, тому якщо реалізовувати точно як в RFC, вивід хеш-функції не буде відповідати деяким тестовим прикладам з RFC (`abcdefghijklmnopqrstuvwxyz` і довшим).
16 байтів чексуми додаються до повідомлення , нова довжина повідомлення
На третьому кроці виділяється і обнуляється буфер для дайджесту повідомлення з 48 байтів.
На четвертому кроці виконується хешування повідомлення блок за блоком. Використовується таке саме значення перестановки як на кроці 2.
для і := від 0 до N'/16-1: // для кожного блоку по 16 байт для j від 0 до 15: X[16+j] := M[i*16+j] X[32+j] := X[16+j] xor X[j] t := 0 для j := від 0 до 17: // 18 раундів хешування для k := від 0 до 47: t := X[k] := X[k] xor S[t] t := t + j mod 256
На останньому кроці повертають перших 16 байтів вмісту буфера X.
Приклад реалізації на Python
def MD2(data): ''' >>> MD2(b'') '8350e5a3e24c153df2275c9f80692773' >>> MD2(b'a') '32ec01ec4a6dac72c0ab96fb34c0b5d1' >>> MD2(b'abc') 'da853b0d3f88d99b30283a69e6ded6bb' >>> MD2(b'message digest') 'ab4f496bfb2a530b219ff33031fe06b0' >>> MD2(b'abcdefghijklmnopqrstuvwxyz') '4e8ddff3650292ab5a4108c3aa47940b' >>> MD2(b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') 'da33def2a42df13975352846c30338cd' >>> MD2(b'12345678901234567890123456789012345678901234567890123456789012345678901234567890') 'd5976f79d83d3a0dc9806c3c66f3efd8' ''' M = list(data) # Крок 1. Доповнення i = 16 - (len(M) % 16) M = M + [i] * i N = len(M) # Крок 2. Додавання чексуми C = [0] * 16 L = 0 for i in range(N//16): for j in range(16): c = M[i*16 + j] L = C[j] = C[j]^S[c ^ L] M = M + C N = len(M) # Крок 3. Ініціалізація буфера MD X = [0] * 48 # Крок 4. обробка повідомлення 16-байтовими блоками for i in range(N//16): for j in range(16): X[16+j] = M[i*16+j] X[32+j] = X[16+j]^X[j] t = 0 for j in range(18): for k in range(48): t = X[k]^S[t] X[k] = t t = (t + j) % 256 # Крок 5. Вивід return ''.join(f'{x:02x}' for x in X[:16]) 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 ]
Перестановка S
Масив з 256 байтів S - це S-таблиця. Її побудовано перемішуванням цілих чисел від 0 до 255 використовуючи варіант [en] в якому генератор псевдовипадкових чисел використовує цифри десяткового представлення Пі (див. [en]).
Цей розділ потребує доповнення. |
Реалізації
В RFC 1319 дається еталонна реалізація на С, крім цього існують реалізації на Python, JavaScript, Java, Goта іншими мовами програмування.
Безпека
Функція демонструє лавиновий ефект, зміна лише одного символа змінює кожен байт в хеші. Наприклад в наступних двох хешах червоним кольором показано половинку байта що не змінилась:
MD2('wikipedia') = 'e01ebd633170ac3210b4c25e941b3417' MD2('wikipedib') = 'b2451ac2a2691e485a30519caf8c0512'
Хеш має розмір 128 біт, тому для того аби знайти повідомлення яке хешується в найгіршому випадку треба перебрати варіантів. Знайдені вразливості, які дозволяють скоротити кількість варіантів до
Цей розділ потребує доповнення. |
Історія
Після винайдення асиметричної криптографії й алгоритму RSA, постала проблема того що RSA занадто повільний для того аби підписувати довгі повідомлення. Безпечна криптографічна хеш-функція могла б значно підвищити зручність цифрового підпису, тому були створені функції MD та MD2. MD, на відміну від MD2 не була опублікована, і використовувалась в додатках безпечної електронної пошти від RSA Security.
Зноски
- Kaufman, Perlman та Speciner, 2002, Hashes and Message Digests.
- RFC 6149
- RFC Errata Report » RFC Editor.
- MD2.py. Github Gist (англ.).
- RFC 1319
- How is the MD2 hash function S-table constructed from Pi?. Cryptography Stack Exchange. Stack Exchange. 2 серпня 2014. Процитовано 23 травня 2021.
- https://urchin.earth.li/~twic/md2.py
- MD2 — PyCryptodome 3.190b1 documentation. pycryptodome.readthedocs.io.
- js-md2. npm (англ.). 8 лютого 2017.
- MD2 (Oracle Fusion Middleware Crypto FIPS Java API Reference). docs.oracle.com.
- md2 package - github.com/htruong/go-md2 - Go Packages. pkg.go.dev.
- Muller, Frédéric (2004). The MD2 Hash Function Is Not One-Way. Advances in Cryptology - ASIACRYPT 2004: 214—229. doi:https://doi.org/10.1007/978-3-540-30539-2_16.
{{}}
: Перевірте значення|doi=
()
Література
- Kaufman, Charlie; Perlman, Radia; Speciner, Mike (2002). Network security: private communication in a public world (вид. 2.). Upper Saddle River, NJ London: Prentice Hall PTR. ISBN .
Посилання
Це незавершена стаття з криптографії. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
MD2 angl Message Digest Algorithm hesh funkciya rozroblena Ronaldom Riverstom RSA Laboratories v 1989 roci i opisana RFC 1319 onovleno vid RFC 1115 Rozmir heshu 128 bit 16 bajt Vsi operaciyi algoritmu vikonuyutsya z oktetami bajtami MD2ZagalniUpershe oprilyudnenij2008SeriyaMD2 MD4 MD5 MD6DetaliRozmir dadzhesta128 bitRaundiv18 Hocha algoritm vse she povnistyu ne bulo zlamano v 2011 IETF zminilo jogo status na istorichnij i natomist rekomenduye vikoristovuvati SHA 256 chi inshi silni algoritmi Opis algoritmuSpochatku povidomlennya dopovnyuyut tak shob jogo dovzhina v bajtah bula kratna 16 Dlya cogo dodayut do kincya povidomlennya i displaystyle i vid 1 do 16 ti bajtiv kozhen z yakih mistit znachennya i displaystyle i Povidomlennya matime dovzhinu N n i displaystyle N n i taku sho N 0 mod16 displaystyle N equiv 0 pmod 16 M displaystyle M poznachatime dopovnene povidomlennya Na drugomu kroci dodayut cheksumu C displaystyle C vikoristovuyuchi vipadkovu perestanovku z 256 bajt pobudovanu z cifr chisla Pi S displaystyle S Dlya cogo robitsya nastupne dlya i vid 0 do 15 C i 0 L 0 dlya i vid 0 do N 16 1 dlya kozhnogo bloku po 16 bajt dlya j vid 0 do 15 c M i 16 j simvol v bloci L C j C j xor S c xor L onovlyuyemo cheksumu V opisi cogo kroku RFC mistit pomilku vipravlenu v Errata 555 zamist L C j C j xor S c xor L tam roblyat prisvoyennya L C j S c xor L tomu yaksho realizovuvati tochno yak v RFC vivid hesh funkciyi ne bude vidpovidati deyakim testovim prikladam z RFC abcdefghijklmnopqrstuvwxyz i dovshim 16 bajtiv cheksumi dodayutsya do povidomlennya M displaystyle M nova dovzhina povidomlennya N N 16 displaystyle N N 16 Na tretomu kroci vidilyayetsya i obnulyayetsya bufer dlya dajdzhestu povidomlennya z 48 bajtiv Na chetvertomu kroci vikonuyetsya heshuvannya povidomlennya blok za blokom Vikoristovuyetsya take same znachennya perestanovki S displaystyle S yak na kroci 2 dlya i vid 0 do N 16 1 dlya kozhnogo bloku po 16 bajt dlya j vid 0 do 15 X 16 j M i 16 j X 32 j X 16 j xor X j t 0 dlya j vid 0 do 17 18 raundiv heshuvannya dlya k vid 0 do 47 t X k X k xor S t t t j mod 256 Na ostannomu kroci povertayut pershih 16 bajtiv vmistu bufera X Priklad realizaciyi na Python def MD2 data gt gt gt MD2 b 8350e5a3e24c153df2275c9f80692773 gt gt gt MD2 b a 32ec01ec4a6dac72c0ab96fb34c0b5d1 gt gt gt MD2 b abc da853b0d3f88d99b30283a69e6ded6bb gt gt gt MD2 b message digest ab4f496bfb2a530b219ff33031fe06b0 gt gt gt MD2 b abcdefghijklmnopqrstuvwxyz 4e8ddff3650292ab5a4108c3aa47940b gt gt gt MD2 b ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 da33def2a42df13975352846c30338cd gt gt gt MD2 b 12345678901234567890123456789012345678901234567890123456789012345678901234567890 d5976f79d83d3a0dc9806c3c66f3efd8 M list data Krok 1 Dopovnennya i 16 len M 16 M M i i N len M Krok 2 Dodavannya cheksumi C 0 16 L 0 for i in range N 16 for j in range 16 c M i 16 j L C j C j S c L M M C N len M Krok 3 Inicializaciya bufera MD X 0 48 Krok 4 obrobka povidomlennya 16 bajtovimi blokami for i in range N 16 for j in range 16 X 16 j M i 16 j X 32 j X 16 j X j t 0 for j in range 18 for k in range 48 t X k S t X k t t t j 256 Krok 5 Vivid return join f x 02x for x in X 16 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 Perestanovka S Masiv z 256 bajtiv S ce S tablicya Yiyi pobudovano peremishuvannyam cilih chisel vid 0 do 255 vikoristovuyuchi variant en v yakomu generator psevdovipadkovih chisel vikoristovuye cifri desyatkovogo predstavlennya Pi div chislo nichogo ne shovav u rukavi en Cej rozdil potrebuye dopovnennya RealizaciyiV RFC 1319 dayetsya etalonna realizaciya na S krim cogo isnuyut realizaciyi na Python JavaScript Java Gota inshimi movami programuvannya BezpekaFunkciya demonstruye lavinovij efekt zmina lishe odnogo simvola zminyuye kozhen bajt v heshi Napriklad v nastupnih dvoh heshah chervonim kolorom pokazano polovinku bajta sho ne zminilas MD2 wikipedia e01ebd633170ac3210b4c25e941b3 417 MD2 wikipedib b2451ac2a2691e485a30519caf8c0 512 Hesh maye rozmir 128 bit tomu dlya togo abi znajti povidomlennya yake heshuyetsya v najgirshomu vipadku treba perebrati 2128 displaystyle 2 1 28 variantiv Znajdeni vrazlivosti yaki dozvolyayut skorotiti kilkist variantiv do 2104 displaystyle 2 1 04 Cej rozdil potrebuye dopovnennya IstoriyaPislya vinajdennya asimetrichnoyi kriptografiyi j algoritmu RSA postala problema togo sho RSA zanadto povilnij dlya togo abi pidpisuvati dovgi povidomlennya Bezpechna kriptografichna hesh funkciya mogla b znachno pidvishiti zruchnist cifrovogo pidpisu tomu buli stvoreni funkciyi MD ta MD2 MD na vidminu vid MD2 ne bula opublikovana i vikoristovuvalas v dodatkah bezpechnoyi elektronnoyi poshti vid RSA Security ZnoskiKaufman Perlman ta Speciner 2002 Hashes and Message Digests RFC 6149 RFC Errata Report RFC Editor MD2 py Github Gist angl RFC 1319 How is the MD2 hash function S table constructed from Pi Cryptography Stack Exchange Stack Exchange 2 serpnya 2014 Procitovano 23 travnya 2021 https urchin earth li twic md2 py MD2 PyCryptodome 3 190b1 documentation pycryptodome readthedocs io js md2 npm angl 8 lyutogo 2017 MD2 Oracle Fusion Middleware Crypto FIPS Java API Reference docs oracle com md2 package github com htruong go md2 Go Packages pkg go dev Muller Frederic 2004 The MD2 Hash Function Is Not One Way Advances in Cryptology ASIACRYPT 2004 214 229 doi https doi org 10 1007 978 3 540 30539 2 16 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite journal title Shablon Cite journal cite journal a Perevirte znachennya doi dovidka LiteraturaKaufman Charlie Perlman Radia Speciner Mike 2002 Network security private communication in a public world vid 2 Upper Saddle River NJ London Prentice Hall PTR ISBN 0130460192 PosilannyaRFC 1319 RFC 1115 RFC 6149 Ce nezavershena stattya z kriptografiyi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi