@savva09
Начинающий .NET-ер

Является ли мой алгоритм криптостойким? Если нет, то где его уязвимость?

код алгоритма на C#
// 1. Запрос от пользователя:
Console.Write("Mode (encode/decode): ");
var mode = Console.ReadLine();

Console.Write("Read from (console/{path to file}): ");
var from = Console.ReadLine();

Console.Write("Write to (console/{path to file}): ");
var to = Console.ReadLine();

// 2. Чтение данных из консоли или файла:
string? input;
string? key;

if (from == "console")
{
    Console.Write("To process: ");
    input = Console.ReadLine();
}
else
{
    input = File.ReadAllText(from);
}

Console.Write("Key: ");
key = Console.ReadLine();

// 3. Проверка наличия данных и ключа:
if ((input is null) || (key is null) || (input == "") || (key == ""))
    throw new ArgumentNullException();

// 4. Преобразование данных в байты:
byte[] inbytes;

if (mode == "encode")
    inbytes = Encoding.Default.GetBytes(input);
else
    inbytes = input.Split(' ').Select(ch => Convert.ToByte(ch)).ToArray();

// 5. Шифрование или дешифрование данных:
var result = Process(inbytes, key);

// 6. Запись результатов в консоль или файл:
if (to == "console")
{
    Console.Write("Processed data: ");
    if (mode == "decode")
        Console.WriteLine(Encoding.Default.GetString(result));
    else
        Console.WriteLine(string.Join(' ', result));
}
else
{
    if (mode == "decode")
        File.WriteAllText(to, Encoding.Default.GetString(result));
    else 
        File.WriteAllText(to,string.Join(' ', result));
}

// 7. Вывод сообщения об успешном выполнении:
Console.WriteLine("Ok");

Console.ReadLine();


Реализация функции шифрования/дешифрования:
byte[] Process(byte[] pInput, string pKey)
{
    var sha512 = SHA512.Create();

    var hash = sha512.ComputeHash(Encoding.Default.GetBytes(pKey));

    Random rand;

    for (int i = 0; i < 16; i++)
    {
        var seed = BitConverter.ToInt32(hash, i*4);
        
        rand = new Random(Convert.ToInt32(seed));
        
        var kbytes = new byte[pInput.Length];

        rand.NextBytes(kbytes);

        for (int j = 0; j < inbytes.Length; j++)
        {
            inbytes[j] ^= kbytes[j];
        }
    }
    return inbytes;
}

Этот код представляет собой реализацию шифрования и дешифрования данных с использованием алгоритма SHA512 и псевдослучайных чисел. Он принимает на вход строку, ключ и указывает, нужно ли шифровать или дешифровать данные.

Если режим установлен на "encode", то ввод преобразуется в байты с помощью Encoding.Default.GetBytes и затем шифруется. Если режим установлен на "decode", то ввод преобразуется в массив байтов, разделенных пробелами, и затем дешифруется.

Шифрование происходит следующим образом:

  1. Создается хеш ключа с помощью SHA512(его размер = 16 байт).
  2. Для каждого из 16 блоков хеша создается случайное число с помощью Random, используя значение блока в качестве начального числа.
  3. Создается массив байтов того же размера, что и ввод, и заполняется случайными числами.
  4. Каждый байт ввода XOR-суммируется с соответствующим байтом массива байтов.
  5. Дешифрование происходит аналогичным образом, но вместо создания случайных чисел используются значения из хеша ключа.


Результат шифрования или дешифрования затем записывается в файл или выводится в консоль в зависимости от указанного пути вывода.

мое мнение о криптостойкости

1. Я считаю что такой алгоритм не поддается лингвистическому анализу, так как даже одинаковый символ может кодироваться разными символами
2. Я считаю что такой алгоритм стойкий к коллизиям ключей, так как хеш-функция sha512 и последующая псевдо-рандомизация позволяют создать большой разброс даже при минимальных отклонениях в ключе
3. Я считаю что такой алгоритм не поддается развертыванию в обратном порядке по той же причине. Использование хеш-функции нивелирует шанс предугадать ключ или байты для ксора

Например abcde с ключом 123 шифруется как " л | l | Ї | | Ё " где | - просто разделитель


Данный алгоритм был написан исключительно в целях исследования и только из интереса
  • Вопрос задан
  • 308 просмотров
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Шифрование происходит следующим образом:

Создается хеш ключа с помощью SHA512(его размер = 16 байт).
Для каждого из 16 блоков хеша создается случайное число с помощью Random, используя значение блока в качестве начального числа.
Создается массив байтов того же размера, что и ввод, и заполняется случайными числами.
Каждый байт ввода XOR-суммируется с соответствующим байтом массива байтов.

У этого алгоритма есть как минимум следующая уязвимость: если кто-то может получить пару "фрагмент открытого текста" - "соответствующий шифртекст" хотя бы для какого-нибудь открытого текста и заданного пароля, то он сможет расшифровать соответствующий фрагмент из любого текста зашифрованного с тем же паролем. Просто поксорив результат с известным фрагментом открытого текста и с соотвтетсвующим ему шифртекстом.
Ответ написан
@Everything_is_bad
Нет, потому что доказательство криптостойкости должен предоставлять автор алгоритма, причем математическое доказательство, а все остальные должны уже это доказательство проверить.
Ответ написан
@Shaman_RSHU
Вот Вам на халяву пару идей.
Ваш код представляет собой простую реализацию шифрования и дешифрования данных с использованием алгоритма SHA512 и псевдослучайных чисел. Однако, стоит отметить, что использование Random с фиксированным началом (seed) в данном контексте может не обеспечить достаточной безопасности, так как последовательность псевдослучайных чисел может быть предсказуема. Кроме того, использование Encoding.Default может привести к проблемам с кодировкой, особенно если данные содержат символы, которые не поддерживаются текущей кодовой страницей системы.

Давайте улучшим ваш код, убрав зависимость от Random и используя более безопасный способ генерации ключа для шифрования и дешифрования. Мы также заменим Encoding.Default на Encoding.UTF8 для обеспечения совместимости с большим диапазоном символов.
Улучшенная реализация функции шифрования/дешифрования:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // Ваш код для чтения ввода пользователя и вызова функции Process
    }

    static byte[] Process(byte[] input, string key, bool encode)
    {
        using (var sha512 = SHA512.Create())
        {
            var hash = sha512.ComputeHash(Encoding.UTF8.GetBytes(key));
            var result = new byte[input.Length];

            for (int i = 0; i < input.Length; i++)
            {
                // Используем XOR для шифрования/дешифрования
                result[i] = (byte)(input[i] ^ hash[i % hash.Length]);
            }

            return result;
        }
    }
}


Изменения:

Удаление зависимости от Random: Вместо использования Random для генерации псевдослучайных чисел, мы используем XOR с байтами хеша. Это обеспечивает более простой и надежный способ шифрования и дешифрования.

Использование Encoding.UTF8: Замена Encoding.Default на Encoding.UTF8 обеспечивает более широкую поддержку символов и уменьшает риск ошибок кодировки.

Упрощение логики шифрования/дешифрования: Удаление лишних шагов и упрощение логики делает код более читаемым и понятным.

Эта улучшенная реализация обеспечивает более безопасное и надежное шифрование и дешифрование данных, используя алгоритм SHA512 и XOR-операцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы