Untitled

ip3
 avatar
unknown
plain_text
a month ago
2.6 kB
4
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;
}
Leave a Comment