Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Пока ты читаешь это, на нашей планете происходят миллиарды и триллионы вычислений: Алексей решил войти в свой аккаунт 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 если ты знаешь как можно уничтожить этот метод шифрования, то я куплю тебе кофе с булочкой.