Untitled
ip3unknown
plain_text
10 months ago
2.6 kB
6
Indexable
#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;
}
Editor is loading...
Leave a Comment