Robotex |
Отправлено: 18 Февраля, 2011 - 04:27:56
|
Новичок
Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009
Помог: 0 раз(а)
|
Написал свою реализацию алгоритма MD2. Но вот почему-то он генерирует неправильный хеш (не совпадает с эталоном), хотя код уже несколько раз перепроверил. В чем я ошибся?
CODE ( htmlphp):
скопировать код в буфер обмена
<?php 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); $input_string = ""; echo "Input string: ".$input_string."<br />"; for($i=0;$i<strlen($input_string);$i++) { $input_array[$i] = $input_string[$i]; } $length = count($input_array); echo "String length: ".$length."<br />"; $pad = 16 - $length%16; echo "Padding by ".$pad." symbols<br />"; for($i=$length;$i<$length+$pad;$i++) { $input_array[$i] = $pad; } $length += $pad; echo "Now input_array are:<br /><pre>"; echo "</pre>"; echo "New length: ".$length."<br />"; for($i=0;$i<16;$i++) { $C[$i] = 0; } $L = 0; for($i = 0;$i<$length/16;$i++) { for($j = 0;$j<16;$j++) { $c = $input_array[$i*16+$j]; $C[$j] = $C[$j] ^ $S[$c ^ $L]; $L = $C[$j]; } } echo "Array C:<br /><pre>"; echo "</pre>"; for($i=0;$i<count($C);$i++) { $input_array[$length+$i] = $C[$i]; } echo "Now input_array are:<br /><pre>"; echo "</pre>"; echo "New length: ".$length."<br />"; for($i=0;$i<48;$i++) { $X[$i] = 0; } for($i = 0;$i<$length/16;$i++) { for($j = 0;$j<16;$j++) { $X[16+j] = $input_array[$i*16+$j]; $X[32+j] = ($X[16+j] ^ $X[j]); } $t = 0; for($j = 0;$j<18;$j++) { for($k = 0;$k<48;$k++) { $t = ($X[$k] ^ $S[$t]); $X[$k] = ($X[$k] ^ $S[$t]); } $t = ($t+$j)%256; } } echo "Array X:<br /><pre>"; echo "</pre>"; $result = ""; for($i=0;$i<16;$i++) { } echo "MD2 Hash: ".$result."<br />"; echo "Etalon: ".hash("md2", $input_string)."<br />"; ?>
|
|
|
Robotex |
Отправлено: 20 Февраля, 2011 - 19:16:45
|
Новичок
Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009
Помог: 0 раз(а)
|
Переписал на С, хеш другой, но тоже неправильный.
CODE ( htmlphp):
скопировать код в буфер обмена
#include <iostream> #include <iomanip> using namespace std; unsigned char 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 }; struct HexCharStruct { unsigned char c; HexCharStruct(unsigned char _c) : c(_c) { } }; inline std::ostream& operator<<(std::ostream& o, const HexCharStruct& hs) { return (o << std::hex << (int)hs.c); } inline HexCharStruct hex(unsigned char _c) { return HexCharStruct(_c); } void md2() { unsigned char input_array[32]; int length = 0; unsigned char pad = 16; for(unsigned int j = length;j<length+pad;j++) { input_array[j] = pad; } length += pad; unsigned char C[16]; for(unsigned char i=0;i<16;i++) C[i] = 0; unsigned char L = 0; for(unsigned int i = 0;i<length/16;i++) { for(unsigned char j = 0;j<16;j++) { unsigned char c = input_array[i*16+j]; C[j] = C[j] ^ PI_SUBST[c ^ L]; L = C[j]; } } for(unsigned char i=0;i<16;i++) input_array[16+i] = C[i]; length = 32; unsigned char X[48]; for(unsigned char i=0;i<48;i++) X[i] = 0; for(unsigned int i = 0;i<length/16;i++) { for(unsigned char j = 0;j<16;j++) { X[16+j] = input_array[i*16+j]; X[32+j] = (X[16+j] ^ X[j]); } unsigned char t = 0; for(unsigned char j = 0;j<18;j++) { for(unsigned char k = 0;k<48;k++) { t = (X[k] ^ PI_SUBST[t]); X[k] = (X[k] ^ PI_SUBST[t]); } t = (t+j)%256; } } for(unsigned char i =0;i<16;i++) { cout << hex(X[i]); } cout << endl; } int main() { md2(); return 0; }
|
|
|
|