Я предполагаю, что технически должен утверждать свою собственную награду за ripemd160
Вот рабочий код для ripemd160 адаптированной почти дословно
Вот. К сожалению о форматировании, но он должен вставить обратно в Mathematica красиво.
(*
Эта функция находит ripemd160 хэш списка байт, выраженные в виде целых чисел.
Целые больше 255 и меньше 0, усекаются до 8 бит.
Этот код был адаптирован из: http://www.win.tue.nl/~berry/2WC01/CryptographicHash-Collisions.nb
*)
ripemd160 [bytelist_List /; или [А @@ IntegerQ / @ bytelist, длина [bytelist] == 0]]: = Модуль [{F, Y, Z, S, h1, h2, h3, h4, h5, а, б , с, д, е, т, т, X, R, хх, I, J, K, X, BitRotateLeft, конвертировать},
х = Свести [IntegerDigits [bytelist, 2, 8]];
BitRotateLeft [X_, П-]: = FromDigits [RotateLeft [IntegerDigits [х, 2,32], п], 2];
преобразовать [X_]: = FromDigits [Reverse [IntegerDigits [х, 256,4]], 256];
F [J_, u_, V_, ш _]: =
Если [J<= 16, BitXor [U, V, W],
Если [J<= 32, BitOr [BitAnd [U, V], BitAnd [BitNot [и], ш]],
Если [J<= 48, BitXor [BitOr [и, BitNot [v]], ж],
Если [J<= 64, BitOr [BitAnd [U, W], BitAnd [v, BitNot [ш]]],
BitXor [и, BitOr [v, BitNot [ш]]]
]]]];
у [0, J_]: = у [0, J] = Если [у<= 16, 0, если [у<= 32, 16 ^^ 5a827999, если [у<= 48, 16 ^^ 6ed9eba1, если [у<= 64,16 ^^ 8f1bbcdc, 16 ^^ a953fd4e]]]];
у [1, J_]: = у [1, J] = Если [у<= 16, 16 ^^ 50a28be6, если [у<= 32, 16 ^^ 5c4dd124, если [у<= 48, 16 ^^ 6d703ef3, если [у<= 64,16 ^^ 7a6d76e9,0]]]];
г [0] = Flatten [{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {7,4,13,1 , 10,6,15,3,12,0,9,5,2,14,11,8},
{3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12}, {1,9,11,10,0,8,12,4 , 13,3,7,15,14,5,6,2}, {4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13 }}];
г [1] = Flatten [{{5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12}, {6,11,3,7 , 0,13,5,10,14,15,8,12,4,9,1,2}, {15,5,1,3,7,14,6,9,11,8,12,2 , 10,0,4,13}, {8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14}, {12,15,10 , 4,1,5,8,7,6,2,13,14,0,3,9,11}]};
с [0] = Flatten [{{11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8}, {7,6,8,13 , 11,9,7,15,7,12,15,9,11,7,13,12}, {11,13,6,7,14,9,13,15,14,8,13,6 , 5,12,7,5}, {11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12}, {9,15,5 , 11,6,8,13,12,5,12,13,14,11,8,5,6}}];
с [1] = Flatten [{{8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6}, {9,13,15,7 , 12,8,9,11,7,7,12,7,6,15,13,11}, {9,7,15,11,8,6,6,14,12,13,5,14 , 13,13,7,5}, {15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8}, {8,5,12 , 9,12,5,14,6,8,13,6,5,15,13,11,11}]};
м = Потолочный [(длина [х] +65) / 512];
г = 512m-Длина [х] -64;
хх = Регистрация [х, {1}, таблица [0, {г-1}], Сплющите [IntegerDigits [назад [IntegerDigits [Mod [Длина [х], 2 ^ 64], 256,8]], 2,8 ]]];
{H1, h2, h3, h4, h5} = {16 ^^ 67452301,16 ^^ efcdab89,16 ^^ 98badcfe, 16 ^^ 10325476,16 ^^ c3d2e1f0};
Для [г = 0, я<м, я ++,
Для [J = 0, J<16, J ++, Х [J] = FromDigits [Возьмем [хх, 512I + 32j + {1,32}], 2];];
Для [к = 0, к<= 1, K ++
{[К], Ь [к], С [K], д [к], е [к]} = {h1, h2, h3, h4, h5};
Для [J 1, J<= 80, J ++, т = моделирование [[к] + ж [(1-к) J + K (81-к), Ь [к], С [K], д [к]] + преобразовать [Х [ г [к] [[J]]]] + у [K, J], 2 ^ 32];
{[К], Ь [к], С [K], д [к], е [к]} = {е [к], моделирование [е [к] + BitRotateLeft [т, с [к] [[ J]]], 2 ^ 32], Ь [к], BitRotateLeft [с [к], 10], д [к]};
];
];
{H1, h2, h3, h4, h5} = Mod [{h2 + с [0] + d [1], Н3 + d [0] + е [1], H4 + е [0] + а [1] , H5 + а [0] + Ь [1], h1 + B [0] + с [1]}, 2 ^ 32];
];
FromDigits [преобразующие / @ {h1, h2, h3, h4, h5}, 2 ^ 32]
];
Если вы хотите добавить ripemd160 по умолчанию Mathematica FUCTION Hash на [], вот как для самых полезных типов шаблонов:
Unprotect [Хэш];
Hash [x_List, "ripemd160"]: = Ripemd160 [х]
Hash [x_String, "ripemd160"]: = Ripemd160 [ToCharacterCode [х]]
Hash [x_Integer, "ripemd160"]: = Ripemd160 [IntegerDigits [х, 256, 20]] (* 160 битное целое число предполагается *)
Вот это правильный выход для тестовых векторов из
http://homes.esat.kuleuven.be/~bosselae/ripemd160.htmlВ работе [63]: =
Hash ["", "ripemd160"] // IntegerString [#, 16]&
Hash ["", "ripemd160"] // IntegerString [#, 16]&
Hash ["азбука", "ripemd160"] // IntegerString [#, 16]&
Hash ["Дайджест сообщения", "ripemd160"] // IntegerString [#, 16]&
Hash ["АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ", "ripemd160"] // IntegerString [#, 16]&
Hash ["abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "ripemd160"] // IntegerString [#, 16]&
Hash ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "ripemd160"] // IntegerString [#, 16]&
Hash [StringJoin @@ Таблица ["1234567890", {8}], "ripemd160"] // IntegerString [#, 16]&
Hash [StringJoin @@ Таблица ["", {10} ^ 6], "ripemd160"] // IntegerString [#, 16]&
Из [63] = 9c1185a5c5e9fc54612808977ee8f548b2258d31
Из [64] = bdc9d2d256b3ee9daae347be6f4dc835a467ffe
Из [65] = 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
Из [66] = 5d0689ef49d2fae572b881b123a85ffa21595f36
Из [67] = f71c27109c692c1b56bbdceb5b9d2865b3708dbc
Из [68] = 12a053384a9c0c88e405a06c27dcf49ada62eb2b
Из [69] = b0e20b6e3116640286ed3a87a5713079b21f5189
Из [70] = 9b752e45573d4b39f4dbd3323cab82bf63326bfb
Из [71] = 52783243c1697bdbe16d37f97f68f08325dc1528