#include #include #include // Логические функции 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; }