Пока ты читаешь это, на нашей планете происходят миллиарды и триллионы вычислений: Алексей решил войти в свой аккаунт Google, Дима оплачивает билеты в самолёт, Настя пишет преподавателю чтобы он дал ей доп задание.

Всё это не обходиться без должного шифрования. Никто не хочет чтобы его nuds увидел весь мир. Для передачи ваших данных используется шифрование с открытым ключом. Оно безопасно, но для тех кто постигает криптографию, может оказаться пугающим. Тот же RSA, AES, всё это непонятно тому, что хочет сделать что-то хорошо защищённое от чужих глаз.

Я хочу изложить метод, который ещё не встречал нигде (если же он существует, просто я о нём не знал, напишите в комментариях) и который будет понятен абсолютно всем. Но в отличии от RSA, Диффи-Хелмана, Эль-Гамаля я покажу на примере симметричного шифрования. Да, он не подходит для передачи между двумя неизвестными. Он не имеет какого-то открытого и закрытого ключа, но от этого слабее не становиться.

Все мы проходили сложение в начальных классах. 46 + 5000 = 5046. Такие действия компьютер делает без проблем, но представим RSA. m^n mod x. Всё, поплыли. Вся сложность алгоритма RSA находиться в разложении на множители. Также компьютеру нужен большой и быстрый "ум", чтобы посчитать m^n.

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

Перейдём к методу

Для начала создадим массив чисел на .... 6. Это мало, поэтому желательно до 2048 и больше. Заполним его рандомно или заранее заданными числами. У меня получился массив [4643634,1234125,8975321,6756421,96874621,5314123]. Далее подготовим платформу:

key = [4643634,1234125,8975321,6756421,96874621,5314123]

text = []

for __ in list(input()):
	text.append(ord(__))

print(text)

ord() - представление слова, как число.

Сейчас мы просто подготавливаем наш текст для шифрования. Я хочу ввести .... ну например "hi bro". На выводе я получил [104, 105, 32, 98, 114, 111].

Далее, мы просто слаживаем номер 0 из массива ключей с номером 0 из массива подготовленного текста.

key = [4643634,1234125,8975321,6756421,96874621,5314123]

text = []

for __ in list(input()):
	text.append(ord(__))

print(text)

etext = []

__key = 0
for __ in range(0,len(text)-1):
	etext.append(text[__]+key[__key])
	if __ == len(key)-1:
		__key = 0
	else:
		__key+=1

print(etext)

Мы получили наш зашифрованный текст: [4643738, 1234230, 8975353, 6756519, 96874735]. В случае если текст больше ключа, позиция ключа сбрасывается в 0 и так по кругу.

Для возвращения оригинала нам нужно просто сделать обратно. Вычесть. Но вместо ord() использовать chr(). chr() противоположен ord(). Вместо "текст в число", выводиться "число в текст".

key = [4643634,1234125,8975321,6756421,96874621,5314123]

text = []

for __ in list(input()):
	text.append(ord(__))

print(text)

etext = []

__key = 0
for __ in range(0,len(text)):
	etext.append(text[__]+key[__key])
	if __key == len(key)-1:
		__key = 0
	else:
		__key+=1

print(etext)

unetext = []

__key = 0
for __ in range(0,len(etext)):
	unetext.append(chr(etext[__]-key[__key]))
	if __key == len(key)-1:
		__key = 0
	else:
		__key+=1

print(unetext)

И в итоге мы получаем такой вывод:

hi bro
[104, 105, 32, 98, 114, 111]
[4643738, 1234230, 8975353, 6756519, 96874735, 5314234]
['h', 'i', ' ', 'b', 'r', 'o']

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

Спрашивается, в чём же сложность такого шифрования? Почему бы мне просто не начать подбирать?

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

Криптостойкость

Время

На подбор ключа из 1024 чисел, в диапазоне например до 100 миллиардов, будет крайне долгим занятием. Это примерно random(0,100000000000)^random(0,100000000000) и всё это повторяется 1024 раза.

Не зависим от ключа и имеет смысл при любом ключе

Ключ, который будет использоваться для дешифровки, напрямую влияет на результат. Никакой ошибки не будет. Например если поменять в нашем примере ключ на другой, то можно добиться результата "hi dad" или "hi mom". Поэтому метод с подбором по смыслу невозможен по времени. Да, по окончанию подбора ключей и проверке смысла нейросетью у вас будут ответы. Но в таком количестве, что где именно то что нужно, узнать будет невозможно! В зашифрованном сообщении "Мама я уехал, завтра вечером приеду" будет гугольское число вариантов подбора, начиная от "Сегодня я опять гонялся от пакетика" и заканчивая безумными "АШИХИТЕО, ШИХИТЕО, СУМУ, КУЦУМИВААА". Все они имеют смысл, все они при своём ключе правильны. Но без знания ключа узнать истинное сообщение из гугола вариантов невозможно!

Невозможен подбор по смыслу

Обычно такой метод используют например для шифрования со сменой буквы на число, другую букву и т.д. Но тут это тоже невозможно. Без знания текста и ключа, нельзя сказать что на двух числах 57462878, находиться одна и та же буква. Там может быть "a" + 57462877, а может быть "d" + 57462874. И такая уникальность не единична! Например тоже самое может быть и наоборот. Можно пропустить "s", у которых ключ при сложении был разный. И на выходе получилось 7656234 и 852761. И ты это никак не узнаешь. В таком случае машина ах**** от жизни и будет молить о помощи.

Ну как-то так. Я считаю этот метод самым лучшим симметричным шифрованием и самым простым в понимании. Если в будущем изобретут шифрование по открытому ключу лучше чем нынешние, то при совмещении этих двух методов наверно получится самый лучший способ шифрования на миллионы лет вперёд.

P.S.: если ты знаешь как можно уничтожить этот метод шифрования, то я куплю тебе кофе с булочкой.

Комментарии (25)


  1. unsignedchar
    11.12.2021 21:23
    +3

    Шифр Вижинера ;) В Википедии более подробно ;)


    1. nnikolyaa Автор
      11.12.2021 21:26

      В его шифре ключ везде один, что делает подбор делом времени


      1. unsignedchar
        11.12.2021 21:35
        +6

        У вас ключ тоже один, и он общий для Алисы и Боба. И шифрование посимвольным сложением.

        Если это ходит как утка и крякает как утка - значит это и есть утка шифр Вижинера.


        1. nnikolyaa Автор
          11.12.2021 22:02

          А, прошу прощения. Я просто думал вы имели ввиду что ключ число, а не массив ключей.


          1. bBars
            13.12.2021 02:20

            Когда говорят, что ключ 2048 бит, это не значит, что с ним обращаются как с одним числом. Когда доходит до процесса (де-)шифрования, его тоже интерпретируют как массив байт длиной 256.


  1. FGV
    11.12.2021 22:24
    +1

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

    https://ru.m.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7


  1. zantor
    11.12.2021 22:35

    На подбор ключа из 1024 чисел, в диапазоне например до 100 миллиардов, будет крайне долгим занятием. Это примерно random(0,100000000000)^random(0,100000000000) и всё это повторяется 1024 раза.

    Берем текст, получаем закодированный результат, отнимаем от каждого числа в массиве ord из оригинального текста, получаем код. При необходимости удлиняем текст, пока не выберем весь "шифроблокнот". Занимает не 100500 миллионов лет, а ~пару миллисекунд

    Шифр неуловимого Джо.


    1. unsignedchar
      11.12.2021 22:41

      Одноразовые (или сеансовые) ключи в помощь ;)


    1. nnikolyaa Автор
      11.12.2021 22:56
      +1

      Да, но это при условии что нам известен оригинал.


      1. unsignedchar
        11.12.2021 23:23
        +4

        Представьте, что этот шифр as is внедрила Германия во время ВМВ. Союзники записывают все сообщения, но расшифровать не могут. И тут славные разведчики похищают ровно 1 нешифрованное сообщение. С этого момента союзники могут расшифровать все сообщения, и старые, и новые. Конец.


        1. Rsa97
          12.12.2021 15:05

          Поэтому использовались шифроблокноты с одноразовыми ключами.

          Например, такие
          image

          Но, если каждое зашифрованное послание начинать словами «Алекс Юстасу», то стойкость шифра проседает примерно до нуля.


  1. Knkplua
    11.12.2021 22:40
    +1

    Шифрование абсолютно стойкое, если текст не длиннее ключа и ключ используется один раз. В остальных случаях применим частотный анализ и все такое.


    1. nnikolyaa Автор
      11.12.2021 23:04

      Не совсем. Разницы как таковой нет. Ты не знаешь, какой символ спрятан за рандомным значением именно этого ключа. Например ключ на 100. При шифровке 101 символа 1 ключом мы X+random. Даже если ты попробуешь сверить его с первым числом, который был зашифрован с тем же 1 ключом, то это не даст ничего. И так далее к остальным ключам.


      1. unsignedchar
        11.12.2021 23:16
        +4

        Ты не знаешь, какой символ спрятан за рандомным значением именно этого ключа

        Допустим, шифруются файлы html. Спорим на булочку, я угадаю первые 6 букв с одного раза? :D


      1. kahi4
        12.12.2021 12:04
        +2

        Возьмём http запрос на html файл: первые символы фиксированны, где-то в теле должно быть <!DOCTYPE html/>, <body> И пару других заранее известных строк. Если файл (точнее ответ с статусом, заголовками, кукакими и контентом) будет больше чем ключ в виде N случайных чисел - перебор до смешного прост.

        Дальше, передать ключ из 2048 * 4 байт та ещё задача, ещё большей задачей является генерация этих чисел, все ГПСЧ обладают предсказуемостью и уже исходя из небольшого количества первых заранее известных строк уже вскрывается весь ключ. Даже если вы солите каждый раунд случайного числа, статистически все еще есть 0.001 вероятность выпадения числа А, когда у других - 0.0000001. Но, допустим, у вас совсем совсем крипкостойкий случайный алгоритм.

        Определить длину ключа по известному файлу тоже не сложно. Благо, плюс, в отличие от степени, вычисляется очень быстро, перебирать на той же видеокарте просто. (Это к тому зачем степень нужна). Мы опираемся на факт что узнав одно число, мы вскрываем его сразу для всех букв по индексу [k*N], где N - длина ключа. А вот mod не позволяет узнать оригинальное число, ой… вот он зачем?

        К слову, он не только затем чтобы было сложнее получить оригинальное число всего по одному совпадению, но ещё чтобы перекрыть вот такую странную вещь:

        Вы написали

        В диапазоне миллиарда

        Мне не нужно проверять миллиард. Я знаю что английские буквы поместятся в 7 бит, так что мне достаточно проверить 128 чисел от s до s+128, где s - зашифрованное число. В итоге у нас уже нужно перебрать просто смешное количество вариантов, каждый из которых - сумма. Хуже того, это мгновенно открывает длину ключа, потому что я могу сделать s mod 128 и получить порядок чисел дальше просто посмотреть когда он начинает повторяться. Да мне даже http / html знать не нужно, да даже не только английский, а все языки на все, это все равно 16 бит на символ, это уже не миллиарды опций на перебор, в всего 64 тысячи.

        Но да, если текст передан только один раз и он короче ключа - это сработает, но тогда проще сразу текст передать, чем сам ключ.

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


  1. Rsa97
    11.12.2021 22:40
    +3

    если ты знаешь как можно уничтожить этот метод шифрования, то я куплю тебе кофе с булочкой

    image


  1. koldyr
    11.12.2021 22:47
    +12

    Вы опасно некомпетентным в криптографии.


  1. nnikolyaa Автор
    11.12.2021 23:19

    Для тех самых "это изи": [1747047, 57779079, 51040523, 80896095, 94514260, 1747046, 57779073, 51040541, 80896117, 94514270]

    Ключ на 5 чисел
    Шифрование и дешифрование проходят с ord() и chr()

    Ответ в личку.


    1. v0s
      12.12.2021 01:02
      +2

      Это ж вам придётся передать другому человеку в тайне 5 восьмизначных чисел (ключ). Какой смысл — можно изначальные 10 букв сообщения и передать в тайне.

      Зашифруйте фразу хотя бы из 40 букв, тогда будет какой-то смысл.


  1. bBars
    12.12.2021 05:50
    +1

    А этот алгоритм только с юникодом работает или как? А то может оказаться, что когда вы доберётесь в своих изысканиях до байтов, то для обеспечения даже такой же паршивой криптостойкости понадобится массив ключа уже не из 6, а 24 элементов.

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

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

    У меня, у дилетанта в области криптоанализа, уйдет пара часов на взлом этого супер шифра, но и они стоят дороже кофе с булочкой ;) А спортивного интереса нет совершенно, потому что это детская задача по сути. Старый алгоритм, которому неспроста пришли на смену уже великое множество более сложных.


  1. bozman
    12.12.2021 11:54

    Все еще пытаюсь найти в тексте намек на иронию...


  1. vilgeforce
    12.12.2021 14:54
    +4

    Главное правило криптографии - никогда не изобретай собственных алгоритмов!


    1. unsignedchar
      12.12.2021 19:40

      Но все алгоритмы кем то изобретены?


      1. vilgeforce
        12.12.2021 19:43

        Верно, но правило остается правилом


  1. SergeyGusev
    13.12.2021 01:47

    За перекрытие шифра мой преподаватель по криптографии расстреливал на месте