The text below is selected, press Ctrl+C to copy to your clipboard. (⌘+C on Mac) No line numbers will be copied.
Guest
B
By Guest on 18th March 2023 07:33:57 AM | Syntax: TEXT | Views: 7



New paste | Download | Show/Hide line no. | Copy text to clipboard
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdint>
  4.  
  5. // Логические функции F, G и H, используемые в алгоритме MD4
  6. #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
  7. #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
  8. #define H(x, y, z) ((x) ^ (y) ^ (z))
  9.  
  10. // Вспомогательные функции для преобразований над 32-битными словами
  11. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
  12. #define FF(a, b, c, d, x, s) {(a) += F((b), (c), (d)) + (x); (a) = ROTATE_LEFT((a), (s));}
  13. #define GG(a, b, c, d, x, s) {(a) += G((b), (c), (d)) + (x) + 0x5a827999; (a) = ROTATE_LEFT((a), (s));}
  14. #define HH(a, b, c, d, x, s) {(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1; (a) = ROTATE_LEFT((a), (s));}
  15.  
  16. // Функция для получения хеш-кода MD4 строки
  17. std::string md4(std::string message) {
  18.     // Инициализация буфера хеша
  19.     uint32_t buffer[4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
  20.  
  21.     // Дополнение сообщения до длины, кратной 512 битам
  22.     uint64_t message_len = message.length();
  23.     uint64_t bit_len = message_len * 8;
  24.     message += (char)0x80;
  25.     while (message.length() % 64 != 56) {
  26.         message += (char)0x00;
  27.     }
  28.     message += std::string(8, '\0');
  29.     for (int i = 0; i < 8; i++) {
  30.         message[message.length() - 8 + i] = (char)(bit_len >> (i * 8) & 0xff);
  31.     }
  32.  
  33.     // Обработка сообщения блоками по 512 бит
  34.     for (int i = 0; i < message.length(); i += 64) {
  35.         // Получение блока сообщения
  36.         uint32_t block[16];
  37.         for (int j = 0; j < 16; j++) {
  38.             block[j] = (message[i + j * 4 + 0] & 0xff) << 0 |
  39.                        (message[i + j * 4 + 1] & 0xff) << 8 |
  40.                        (message[i + j * 4 + 2] & 0xff) << 16 |
  41.                        (message[i + j * 4 + 3] & 0xff) << 24;
  42.         }
  43.  
  44.         // Сохранение текущих значений буфера хеша
  45.         uint32_t
  46.  
  47.  
  48.  
  49. 4rasher@gmail.com
  50. Продолжи код
  51.  
  52. css
  53. Copy code
  54.     uint32_t A = buffer[0];
  55.     uint32_t B = buffer[1];
  56.     uint32_t C = buffer[2];
  57.     uint32_t D = buffer[3];
  58.  
  59.     // Выполнение 4 раундов
  60.     FF(A, B, C, D, block[0], 3);
  61.     FF(D, A, B, C, block[1], 7);
  62.     FF(C, D, A, B, block[2], 11);
  63.     FF(B, C, D, A, block[3], 19);
  64.     FF(A, B, C, D, block[4], 3);
  65.     FF(D, A, B, C, block[5], 7);
  66.     FF(C, D, A, B, block[6], 11);
  67.     FF(B, C, D, A, block[7], 19);
  68.     FF(A, B, C, D, block[8], 3);
  69.     FF(D, A, B, C, block[9], 7);
  70.     FF(C, D, A, B, block[10], 11);
  71.     FF(B, C, D, A, block[11], 19);
  72.     FF(A, B, C, D, block[12], 3);
  73.     FF(D, A, B, C, block[13], 7);
  74.     FF(C, D, A, B, block[14], 11);
  75.     FF(B, C, D, A, block[15], 19);
  76.  
  77.     GG(A, B, C, D, block[0], 3);
  78.     GG(D, A, B, C, block[4], 5);
  79.     GG(C, D, A, B, block[8], 9);
  80.     GG(B, C, D, A, block[12], 13);
  81.     GG(A, B, C, D, block[1], 3);
  82.     GG(D, A, B, C, block[5], 5);
  83.     GG(C, D, A, B, block[9], 9);
  84.     GG(B, C, D, A, block[13], 13);
  85.     GG(A, B, C, D, block[2], 3);
  86.     GG(D, A, B, C, block[6], 5);
  87.     GG(C, D, A, B, block[10], 9);
  88.     GG(B, C, D, A, block[14], 13);
  89.     GG(A, B, C, D, block[3], 3);
  90.     GG(D, A, B, C, block[7], 5);
  91.     GG(C, D, A, B, block[11], 9);
  92.     GG(B, C, D, A, block[15], 13);
  93.  
  94.     HH(A, B, C, D, block[0], 3);
  95.     HH(D, A, B, C, block[8], 9);
  96.     HH(C, D, A, B, block[4], 11);
  97.     HH(B, C, D, A, block[12], 15);
  98.     HH(A, B, C, D, block[2], 3);
  99.     HH(D, A, B, C, block[10], 9);
  100.     HH(C, D, A, B, block[6], 11);
  101.     HH(B, C, D, A, block[14], 15);
  102.     HH(A, B, C, D, block[1], 3);
  103.     HH(D, A, B, C, block[9], 9
  104.  
  105.  
  106.  
  107. 4rasher@gmail.com
  108. Продолжи код
  109.  
  110. css
  111. Copy code
  112.     HH(C, D, A, B, block[5], 11);
  113.     HH(B, C, D, A, block[13], 15);
  114.     HH(A, B, C, D, block[3], 3);
  115.     HH(D, A, B, C, block[11], 9);
  116.     HH(C, D, A, B, block[7], 11);
  117.     HH(B, C, D, A, block[15], 15);
  118.  
  119.     // Добавление результатов текущего блока в переменные состояния
  120.     state[0] += A;
  121.     state[1] += B;
  122.     state[2] += C;
  123.     state[3] += D;
  124. }
  125.  
  126. // Конвертация итогового состояния в 16-ричное число
  127. uint32_t output[4];
  128. output[0] = state[0];
  129. output[1] = state[1];
  130. output[2] = state[2];
  131. output[3] = state[3];
  132. std::ostringstream oss;
  133. for (int i = 0; i < 4; i++) {
  134.     oss << std::hex << std::setfill('0') << std::setw(8) << output[i];
  135. }
  136. return oss.str();
  137. }
  138.  
  139. int main() {
  140. // Пример хеширования символьной строки
  141. std::string input = "The quick brown fox jumps over the lazy dog";
  142. std::string output = md4(input);
  143. std::cout << "Input: " << input << std::endl;
  144. std::cout << "Output: " << output << std::endl;
  145.  
  146. kotlin
  147. Copy code
  148. return 0;
  149. }



  • Recent Pastes