- #include <iostream>
- #include <cstring>
- #include <cstdint>
- // Логические функции F, G и H, используемые в алгоритме MD4
- #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
- #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
- #define H(x, y, z) ((x) ^ (y) ^ (z))
- // Вспомогательные функции для преобразований над 32-битными словами
- #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
- #define FF(a, b, c, d, x, s) {(a) += F((b), (c), (d)) + (x); (a) = ROTATE_LEFT((a), (s));}
- #define GG(a, b, c, d, x, s) {(a) += G((b), (c), (d)) + (x) + 0x5a827999; (a) = ROTATE_LEFT((a), (s));}
- #define HH(a, b, c, d, x, s) {(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1; (a) = ROTATE_LEFT((a), (s));}
- // Функция для получения хеш-кода MD4 строки
- std::string md4(std::string message) {
- // Инициализация буфера хеша
- uint32_t buffer[4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
- // Дополнение сообщения до длины, кратной 512 битам
- uint64_t message_len = message.length();
- uint64_t bit_len = message_len * 8;
- message += (char)0x80;
- while (message.length() % 64 != 56) {
- message += (char)0x00;
- }
- message += std::string(8, '\0');
- for (int i = 0; i < 8; i++) {
- message[message.length() - 8 + i] = (char)(bit_len >> (i * 8) & 0xff);
- }
- // Обработка сообщения блоками по 512 бит
- for (int i = 0; i < message.length(); i += 64) {
- // Получение блока сообщения
- uint32_t block[16];
- for (int j = 0; j < 16; j++) {
- block[j] = (message[i + j * 4 + 0] & 0xff) << 0 |
- (message[i + j * 4 + 1] & 0xff) << 8 |
- (message[i + j * 4 + 2] & 0xff) << 16 |
- (message[i + j * 4 + 3] & 0xff) << 24;
- }
- // Сохранение текущих значений буфера хеша
- uint32_t
- 4rasher@gmail.com
- Продолжи код
- css
- Copy code
- uint32_t A = buffer[0];
- uint32_t B = buffer[1];
- uint32_t C = buffer[2];
- uint32_t D = buffer[3];
- // Выполнение 4 раундов
- FF(A, B, C, D, block[0], 3);
- FF(D, A, B, C, block[1], 7);
- FF(C, D, A, B, block[2], 11);
- FF(B, C, D, A, block[3], 19);
- FF(A, B, C, D, block[4], 3);
- FF(D, A, B, C, block[5], 7);
- FF(C, D, A, B, block[6], 11);
- FF(B, C, D, A, block[7], 19);
- FF(A, B, C, D, block[8], 3);
- FF(D, A, B, C, block[9], 7);
- FF(C, D, A, B, block[10], 11);
- FF(B, C, D, A, block[11], 19);
- FF(A, B, C, D, block[12], 3);
- FF(D, A, B, C, block[13], 7);
- FF(C, D, A, B, block[14], 11);
- FF(B, C, D, A, block[15], 19);
- GG(A, B, C, D, block[0], 3);
- GG(D, A, B, C, block[4], 5);
- GG(C, D, A, B, block[8], 9);
- GG(B, C, D, A, block[12], 13);
- GG(A, B, C, D, block[1], 3);
- GG(D, A, B, C, block[5], 5);
- GG(C, D, A, B, block[9], 9);
- GG(B, C, D, A, block[13], 13);
- GG(A, B, C, D, block[2], 3);
- GG(D, A, B, C, block[6], 5);
- GG(C, D, A, B, block[10], 9);
- GG(B, C, D, A, block[14], 13);
- GG(A, B, C, D, block[3], 3);
- GG(D, A, B, C, block[7], 5);
- GG(C, D, A, B, block[11], 9);
- GG(B, C, D, A, block[15], 13);
- HH(A, B, C, D, block[0], 3);
- HH(D, A, B, C, block[8], 9);
- HH(C, D, A, B, block[4], 11);
- HH(B, C, D, A, block[12], 15);
- HH(A, B, C, D, block[2], 3);
- HH(D, A, B, C, block[10], 9);
- HH(C, D, A, B, block[6], 11);
- HH(B, C, D, A, block[14], 15);
- HH(A, B, C, D, block[1], 3);
- HH(D, A, B, C, block[9], 9
- 4rasher@gmail.com
- Продолжи код
- css
- Copy code
- HH(C, D, A, B, block[5], 11);
- HH(B, C, D, A, block[13], 15);
- HH(A, B, C, D, block[3], 3);
- HH(D, A, B, C, block[11], 9);
- HH(C, D, A, B, block[7], 11);
- HH(B, C, D, A, block[15], 15);
- // Добавление результатов текущего блока в переменные состояния
- state[0] += A;
- state[1] += B;
- state[2] += C;
- state[3] += D;
- }
- // Конвертация итогового состояния в 16-ричное число
- uint32_t output[4];
- output[0] = state[0];
- output[1] = state[1];
- output[2] = state[2];
- output[3] = state[3];
- std::ostringstream oss;
- for (int i = 0; i < 4; i++) {
- oss << std::hex << std::setfill('0') << std::setw(8) << output[i];
- }
- return oss.str();
- }
- int main() {
- // Пример хеширования символьной строки
- std::string input = "The quick brown fox jumps over the lazy dog";
- std::string output = md4(input);
- std::cout << "Input: " << input << std::endl;
- std::cout << "Output: " << output << std::endl;
- kotlin
- Copy code
- return 0;
- }
