Untitled
ip3#include <iostream> #include <vector> #include <bitset> #include <cstdint> // <-- добавляем этот заголовок // S-блоки для GOST const uint8_t S[8][16] = { {3, 7, 4, 14, 1, 11, 13, 6, 9, 2, 12, 5, 15, 10, 8, 0}, {10, 13, 6, 4, 15, 8, 9, 11, 7, 1, 12, 5, 14, 0, 2, 3}, {12, 6, 1, 3, 14, 9, 0, 10, 7, 8, 13, 4, 5, 2, 11, 15}, {8, 11, 14, 1, 7, 10, 9, 6, 13, 0, 4, 2, 12, 5, 3, 15}, {15, 5, 13, 12, 11, 3, 2, 14, 1, 0, 10, 9, 6, 7, 4, 8}, {7, 14, 4, 1, 15, 13, 5, 9, 11, 10, 3, 8, 6, 0, 2, 12}, {9, 0, 8, 13, 4, 6, 10, 7, 11, 5, 1, 12, 3, 15, 2, 14}, {1, 10, 12, 2, 5, 14, 11, 6, 15, 9, 0, 8, 3, 7, 13, 4} }; // Функция трансформации (применение S-блоков) uint32_t transform(uint32_t input) { uint32_t result = 0; for (int i = 0; i < 8; ++i) { // Берём по 4 бита (часть) uint8_t part = static_cast<uint8_t>((input >> (4 * i)) & 0xF); // Заменяем через таблицу S result |= (static_cast<uint32_t>(S[i][part]) << (4 * i)); } return result; } // Раунд-функция uint32_t round_function(uint32_t block, uint32_t key) { // Складываем (с учётом переполнения) блок и ключ uint32_t temp = block + key; // Применяем замену (S-блоки) return transform(temp); } // Шифрование по ГОСТ (32 раунда) void gost_algorithm(uint32_t& left, uint32_t& right, const std::vector<uint32_t>& keys) { for (int i = 0; i < 32; ++i) { uint32_t temp = right; right = left ^ round_function(right, keys[i % 8]); left = temp; } // Меняем местами левую и правую части std::swap(left, right); } int main() { // Исходные данные uint32_t left = 0x11223344; uint32_t right = 0x55667788; // Пример ключей (8 ключей по 32 бита) std::vector<uint32_t> keys = { 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x88888888 }; std::cout << "Initial data: " << std::hex << left << " " << right << std::endl; std::cout << "Keys: "; for (auto k : keys) { std::cout << std::hex << k << " "; } std::cout << std::endl; // Запуск шифрования gost_algorithm(left, right, keys); std::cout << "Encrypted result: " << std::hex << left << " " << right << std::endl; return 0; }
Leave a Comment