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

Ссылка скопирована
1 ответ

код алгоритма на 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();

// 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; }

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 | Ї | | Ё " где | - просто разделитель

Данный алгоритм был написан исключительно в целях исследования и только из интереса

Дополнительно:

> Является ли мой алгоритм криптостойким?

Очевидно нет. Даже читать не нужно.
Те кто способен создать новый алгоритм не задают таких вопросов.

Ответы:

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

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

У этого алгоритма есть как минимум следующая уязвимость: если кто-то может получить пару "фрагмент открытого текста" - "соответствующий шифртекст" хотя бы для какого-нибудь открытого текста и заданного пароля, то он сможет расшифровать соответствующий фрагмент из любого текста зашифрованного с тем же паролем. Просто поксорив результат с известным фрагментом открытого текста и с соотвтетсвующим ему шифртекстом.

  • Таким образом мы только можем получить ксор всех этапов. Т.е. первых х байт из всех 16 этапов. Это не даёт никаких преимуществ потому, что мы не можем знать полный хеш. Возможно стоит сильнее фрагментировать хеш, чтобы уменьшить количество раскрытых частей внутреннего ключа в случае такой утечки. Ну и конечно же я думаю что не стоит рассматривать ситуации, когда большая часть текста является раскрытой. Это просто не имеет смысла
  • Таким образом мы только можем получить ксор всех этапов. Т.е. первых х байт из всех 16 этапов. Это не даёт никаких преимуществ потому, что мы не можем знать полный хеш

    Савва Насыров, ты ошибаешься. Попробуй зашифровать своим алгоритмом буфер состоящий из одних нулей, а потом побайтово поксорь полученным результатом какой-нибудь зашифрованный тем же паролем текст.

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

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

  • jcmvbkbc, я попробую утром.

    Но пока что, я знаю что даже если получить блок со всеми ксорами, это несколько сужает круг поиска сида для рандома, но всё-же не даёт раскрыть всё из-за отсутствия каскадности, когда предыдущий влияет на следующий. Это бесспорно уязвимость. Вопрос насколько критичная

  • Вы правы, все дешифруется за минуту

Нет, потому что доказательство криптостойкости должен предоставлять автор алгоритма, причем математическое доказательство, а все остальные должны уже это доказательство проверить.

  • а что делать, если у меня нет опыта для того чтобы понять криптостойки ли он?
  • Савва Насыров, очевидно, сначала получить опыт, известных алгоритмов с разной надежностью дофига, изучай их.
  • окей. Я проанализировал и обновил данные
  • Савва Насыров, минимум https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D...
  • я извиняюсь, но вы смеетесь? Я не хотел изучить все знания человечества за последние 200 лет. Я спросил как можно быстро оценить имеет ли алгоритм шансы на криптостойкость
  • Савва Насыров, быстро никак, хотя конечно же всё зависит от конкретного значения "быстро" и имеющихся ресурсов, вон некоторые алгоритмы публично несколько лет проверяют.
  • Обычно все ошибки в каких-то банальных вещах. Я понимаю что нужен огромный багаж знаний для полной оценки, но мне будет достаточно знания что я не сделал ошибки типа: просуммировал и обрезал ключ чтобы получить одноразовый сид для рандома
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

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

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

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

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

Таким образом, для оценки криптостойкости алгоритма необходимо учитывать как его математическую основу, так и его реализацию и использование. Рекомендуется провести тщательное тестирование алгоритма на различных атаках и убедиться в его надежности перед использованием в реальных системах.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно