Внимание: при смене режима шифрования все поля, кроме начального текста, будут очищены
Формат данных
Создание ключа
Длина ключа:
Публичный ключ
Приватный ключ
Шифратор
Шифрование строки
Начальные данные:
Результат:
Ключ:
Генерировать IV/nonce/counter:
(если выберете этот пункт, то для шифрования IV будет взят из этого поля, сюда же он будет помещен при генерации)
Где хранится IV/nonce/counter:
(если выберете этот пункт, то после шифрования IV будет помещен в это поле, а для дешифровки будет браться отсюда)
Публичный ключ:
Приватный ключ:
Вычисление хэша строки
Начальные данные (строка):
Результат (hex/base64):
Конвертер hex-base64
Начальные данные (hex/base64):
Результат (base64/hex):
Информация:
От автора: эти инструменты я написал для себя, когда изучал шифрование, и теперь они здесь.
Все написано на js и выполняется
в браузере, поэтому страницу можно скачать и пользоваться оффлайн. Если вы нашли ошибку, или у вас есть идеи по улучшению функционала,
сообщите мне об этом вот сюда.
Это важно. В тексте ниже я постарался простым языком изложить концепцию того, что здесь происходит. Это не руководство по криптографии,
но и не шпаргалка для вашей бабушки, на какую кнопку включать компьютер. Это разговор о базовых понятиях для человека, который
об этих базовых понятиях что-то уже слышал, и вот ему приспичило что-то пошифровать, а он немного растерялся. Если вы итак разбираетесь
в том, что видите, либо если вы вообще ничего не знаете о шифровании и оказались здесь случайно - вот в этих двух полярных случаях
данный текст вам ничем не поможет. Ну а если вы решаете какую-то серьезную задачу, то обращайтесь к серьезной литературе,
гос.тайну я вас тут шифровать не научу. Да и в целом, имейте свою голову на плечах. В конечном итоге ответственность за свои
данные несете вы, а не я, так что принимайте решения сообразные рискам.
Указатели по разделам (кликабельны)
Основные положения
Что выбрать, hex или base64?
В чем отличие симметричного и асимметричного шифрования?
Симметричное шифрование
CBC, CTR, GCM - Что это за режимы такие?
Какую схему шифрования выбрать?
Что это такое IV?
Зачем нужен IV?
Есть ли разница между IV, counter и nonce?
IV генерируется случайно?
Можно ли в качестве IV использовать собственное придуманное значение?
Нужно ли скрывать IV?
Зачем нужна функция отделения IV?
Где лучше хранить IV?
Асимметричное шифрование
Можно ли зашифровать сообщение приватным ключом?
Почему сообщение, зашифрованное публичным ключом не может быть расшифровано этим же публичным ключом, а нужен именно приватный?
Какие настройки для шифрования выбрать?
Основные положения
На странице представлены инструменты для шифрования, вычисления хэша строки и конвертации строки из hex в base64 и обратно.
Если с хэшем и конвертером все более-менее понятно (вставьте исходную строку в поле для начальных данных и нажмите кнопку),
то прежде чем приступить к шифрованию, нужно выбрать в настройках требуемый режим шифрования. Далее создание ключей и
сам процесс шифровки/дешифровки будет проходить в выбранном режиме.
Помимо режима шифрования предлагается так же выбрать формат данных: hex или base64. В этом формате будут выдаваться/приниматься ключи
и результат вычислений. Исходные данные для вычисления хэша, шифрования и результат дешифровки - обычные символы.
Вопрос: Что выбрать, hex или base64?
Ответ: Если не знаете, что все это такое - выбирайте hex.
По сути, и то и другое - это строка. Разница в том, что hex будет значительно длиннее, но он более надежен в плане контроля символов.
Да, base64 компактнее, и
он, пожалуй, чаще выступает основным стандартом для API, но он содержит спецсомволы (+, /, =), которые обязательно сломают вам жизнь,
если вы начнете вставлять эту строку в различные места без предварительного экранирования, не говоря уже о переносах строк, "нестандартных"
символах вроде emoji...
В общем, base64 - это если вы понимаете, что делаете, нужна совместимость с какими-то другими API, либо
важно получить более компактный результат, и вы не планируете вставлять его в разные интересные места (либо
планируете, но готовы ко всему).
Впрочем, вы можете попробовать оба и решить, что вам больше подходит.
В крайнем случае, никто не запрещает вам воспользоваться конвертером и хранить данные в обоих форматах.
Вопрос: Чем отличаются симметричное и асимметричное шифрование?
Ответ: В симметричном шифровании присутствует 1 ключ,
которым данные и шифруются и расшифровываются. По сути, это то, что первое приходит в голову, когда вы думаете о шифровании.
С асимметричным несколько сложнее, там уже есть 2 ключа: публичный и приватный. Публичным ключом данные шифруются,
а приватным расшифровываются.
Далее рассмотрим представленные типы шифрования, сперва симметричное, а затем асимметричное.
Симметричное шифрование
Для симметричного шифрования используется алгоритм AES в 3-х режимах: CTR, CBC и GCM. При создании ключа не забудьте указать его размер.
Куда вставлять ключ и данные для шифрования - разберетесь.
В отдельном поле вы можете сгенерировать IV/nonce/counter или подставить собственное значение, по умолчанию генерация
осуществляется автоматически.
ВАЖНО! Так же при шифровании вы можете выбрать место хранения IV/nonce/counter. По умолчанию, он записывается в начало строки
полученного шифра,
но вы можете вынести его отдельной строкой в соответствующее поле. Если вы его вынесли отдельно, для расшифровки его снова надо будет
добавить в это же поле, либо просто вставить в начало строки шифра (и нажать соответствующий переключатель).
Если механизм работы не до конца ясен, потренеруйтесь на случайных данных, чтобы увидеть, как все устроено.
Вопрос: Что это за режимы такие?
Ответ: AES - Advanced Encryption Standard - это блочный алгоритм шифрования,
который делит ваши данные на блоки равной длины и обращает их в нечитаемый шифр. CTR, CBC и GCM - это схемы, по которым
алгоритм будет работать с блоками ваших данных.
Тут для вас есть 2 новости: хорошая и плохая.
Начнем с плохой. Я не буду детально описывать различия в работе этих схем. Это сложно объяснить простыми словами, "на пальцах".
Если вам нужно углубиться в тему, почитайте соответствующие источники, этого сейчас много. Но давайте объясню так:
AES-CBC - данные разбиваются на блоки, каждый блок данных при шифровании смешивается с предыдущим блоком
(получается такая детерминированная цепочка блоков).
AES-CTR - идея та же, но обрабатывается не по целым блокам, а как поток данных.
AES-GCM - работает, как CTR, но добавляется аутентификация (в остальных нужен HMAC).
Хорошая новость заключается в том, что возможно вам и не нужно вникать. Если вы преследуете личные бытовые цели,
и вам просто надо, чтобы были шифр и ключ, то детали реализации вам не важны.
Вопрос: Какую схему шифрования выбрать?
Ответ: Если у вас нет специфической задачи,
то выбирайте AES-GCM с размером ключа 256, IV генерируйте автоматически, а храните в строке шифра. То есть используйте настройки по умолчанию.
Буквально не трогайте никакие переключатели, пользуйтесь только кнопками.
Почему AES-GCM?
Ну, во-первых: если вы просто хотите развлечься, попробовать что-то новое, зашифровать какие-то личные данные,
то все эти схемы будут работать так, как вы хотите, ваш друг/одноклассник/сосед этот шифр никогда не разгадает, какой
бы режим вы ни выбрали. По идее, вам без разницы. Но надо же что-то выбрать? Вот выберите этот.
Во-вторых: в целом GCM мне видится наиболее предпочтительным при прочих равных. Даже если ваши цели выходят
за рамки строго бытовых, он все равно скорее всего подойдет вам. Вот моя краткая характеристика:
AES-CBC - старый, медленный, без аутентификации. Лучше не используйте его.
AES-CTR - быстрый, потоковый, но тоже без аутентификации.
AES-GCM - быстрый + защита целостности.
Если перед вами стоит серьезная задача, то тут уже надо смотреть по ситуации, решайте как-нибудь сами,
изучайте тематические источники.
Предложенные алгоритмы шифрования в процессе работы создают дополнительный параметр (ну или вы его создаете сами):
AES-CBC - IV
AES-GCM - nonce. Да, он тоже называется IV, но по требованиям стандарта это фактически nonce, поэтому обозначим его так.
AES-CTR - counter
Вы можете и не заметить его наличие, если не выносите его в отдельное поле, а оставляете в строке (не трогаете соответствующий переключатель).
В конце концов, у вас есть ключ и полученный шифр, который этим ключом преобразуется в первоначальный текст,
и если ваши амбиции ограничиваются этим, то этого и достаточно.
Главное - запомните, какой схемой вы шифруете данные и не потеряйте ключ.
Но если вам интересно, что это за загадочный параметр, то давайте немного об этом поговорим.
Диалоги об IV
Вопрос: Что это вообще такое?
Ответ: Это случайно сгенерированный блок, который добавляется к вашему набору данных при шифровании.
Вопрос: Зачем это нужно?
Ответ: Чтобы при шифровании одинаковых наборов данных исключить получение одинакового результата.
Условно можно сказать, что алгоритм шифрования - это формула, и если вы подставляете в нее один и тот же аргумент X, то на выходе всегда будете
получать один и тот же результат Y. Так работает математика, если у вас есть, например, уравнение 2x+3=y, то подставляя вместо X цифру 2, вы всегда
будете получать 2*2+3=y => y=7, и никогда не получите ничего кроме.
Теперь предположим, вы шифруете строку "Привет, мир" 100 раз
одним и тем же ключом, и на выходе каждый раз получаете один и тот же шифр. Ведь ключ один и тот же, начальная строка одна и та же, и
алгоритм один и тот же. С чего бы вам получить разные шифры?
Шифруем одну и ту же строку одним ключом 100 раз:
1. Привет, мир -> abcdefg
2. Привет, мир -> abcdefg
3. Привет, мир -> abcdefg
...
100. Привет, мир -> abcdefg
Всегда один и тот же результат
Согласитесь, это выглядит, как проблема. Вам бы хотелось, чтобы шифр всегда был разным, ведь если кто-то узнает, что шифр "abcdefg"
скрывает строку "Привет, мир", он автоматически разгадает все 100 строк "Привет, мир", и когда в будущем он будет встречать ваш
шифр "abcdefg", он уже будет точно знать, что вы там написали. Если вы работаете с важными данными, это может быть
серьезной угрозой безопасности.
Поэтому мы добавляем к вашей строке "Привет, мир" случайный набор символов, и строка уже выглядит примерно так:
"zxcvbbnm Привет, мир", этот набор символов каждый раз разный, ваша строка с этими символами каждый раз разная,
и результат шифрования каждый раз будет разным.
Поняли идею? А теперь, как оно работает на самом деле. В блочных схемах шифрования ваши данные разбиваются на цепочку
блоков одинакового размера, например:
[ва]-[ши]-[да]-[нн]-[ые]
Что проиходит дальше?
В более простых схемах каждый блок может шифроваться отдельно и независимо от остальных, просто все блоки шифруются по очереди и
результат собирается в итоговый шифр. Конечно, это проблема, потому что если блок где-то повторяется, то и внутри шифра будет повторяющийся
паттерн, не говоря уже о том, что этот паттерн может распространяться и на другие шифры, созданные этим же ключом.
Ну то есть, представьте, что вы шифруете текст по отдельным словам, и все повторяющиеся слова в вашем тексте имеют одинаковый
шифр, и в полученном большом шифре можно заметить повторяющиеся последовательности символов и понять, что в этих местах
одинаковые слова.
Без паники. У нас таких схем нет.
В нашем случае шифрование начинается с первого блока. Полученный результат от первого блока примешивается к процессу шифрования второго блока,
полученный результат от второго блока примешивается к процессу шифрования третьего... Идея в том, что блоки не шифруются независимо,
процесс шифрования всегда детерминирован.
Если продолжать аналогию со словами и текстом, мы шифруем каждое следующее слово, как бы прибавляя к нему
результат от шифрования предыдущего. Таким образом, даже если слова одинаковы, к ним всегда прибавляется разное значение,
и внутри одного шифра уже нет повторяющихся фрагментов.
Да, внутри одного шифра теперь все в порядке. Но одинаковая-то последовательность блоков ("слов"), шифруемых одним и тем же ключом,
по прежнему будет давать один и тот же результат (строка "Привет, мир" всегда шифруется в abcdefg). Это все еще такая "большая формула",
и при подстановке одного и того же значения, мы получаем один и тот же ответ.
В чем проблема нашего подхода? В том, что даже если мы шифруем каждый следующий блок, прибавляя к нему результат шифрования
предыдущего, то первый-то блок у нас все равно всегда один и тот же. Вот бы было замечательно, если бы и первый блок, с которого мы
начинаем, был каждый раз разный. Тогда бы мы, наконец, каждый раз получали разный шифр.
Здесь появляется IV. Он и называется "вектор инициализации", потому как задает общее направление процессу последовательного
шифрования блоков данных. Теперь ваши данные выглядят так:
[IV]-[ва]-[ши]-[да]-[нн]-[ые]
IV по сути является нулевым блоком, с которого начинается процесс шифрования и, являясь случайным, он позволяет всегда получить
разный результат на выходе.
Результат шифрования каждого последующего блока зависит от предыдущего, а поскольку мы всегда начинаем со случайного блока,
то и общий результат будет всегда разным. Однако, если вы попробуете зашифровать
один и тот же набор данных ("Привет, мир") одним и тем же ключом, добавляя один и тот же IV, то увидите, что шифр опять получается одинаковый.
Потому что вы используете один и тот же IV, а значит набор данных у вас снова один и тот же, и результат снова тот же.
На практике никогда не делайте так, это ломает безопасность. Только ради эксперимента, чтобы увидеть, как это работает.
Вопрос:Есть ли разница между IV, counter и nonce?
Ответ: Есть. Но в нашей реализации она не важна.
Проблема в том, что если объяснять это коротко,
то концепция может стать менее понятной, чем она есть в тот момент, когда вы задались этим вопросом. Но если хотите, то вот:
IV - Initialization Vector - вектор инициализации, общий термин для начального значения в криптографических алгоритмах. По сути это просто
случайный блок данных, который в блочных режимах шифрования добавляется к основным данным для обеспечения уникальности шифра, даже
если вы шифруете одинаковые данные. Nonce и counter - это частные случаи IV.
Да, IV в режиме CBC должен быть случайным и уникальным.
Nonce - Number used once - одноразовый номер, который гарантирует уникальность сессии шифрования (и самого шифра), так
же добавляется к шифруемым данным. Он обязательно должен быть уникальным, но не обязательно каждый раз случайным, вполне может быть
последовательным (по типу, как 1, 2, 3...), если этот процесс контролируется системой.
Counter - счетчик. Для простоты можно сказать, что это расширенный nonce (что не совсем корректно, но в нашем случае ок), но если
nonce - это уникальный номер всей сессии шифрования, то counter - это только наполовину nonce: первая половина - это уникальный номер
сессии, а вторая половина будет меняться в зависимости от номера шифруемого блока. То есть, nonce уникален для всей сессии в целом,
а counter не просто для сессии, но и для каждого блока.
Испугались? Не бойтесь.
В нашей реализации, на уровне пользователя (вас), все это одно и то же. Это все IV, и он нужен для уникализации ваших данных.
Разницы в использовании нет. Они даже генерируются одинаковым способом.
Да, схемы шифрования работают с ними по-разному.
Главное отличие для нас: IV и counter имеют размер 16 байт, а nonce - 12 байт. Имейте это ввиду, если
планируете извлекать этот параметр из строки. Для hex - это 32 и 24 символа соответственно. И да, вы можете вырезать и вставлять его в начало
строки собственноручно: ctrl+x - ctrl+v, это просто начальный блок данных, часть строки, никакой магии.
Далее и IV, и counter, и nonce для краткости я буду называть просто IV, но вы будете иметь
ввиду, что речь идет о параметре, соответствующем выбранной вами схеме шифрования.
Вопрос: IV генерируется случайно?
Ответ: В нашем случае - всегда да.
Вопрос: Можно ли в качестве IV использовать собственное придуманное значение?
Ответ: Можно. Но вы должны понимать, зачем вы это делаете. Если ваше
значение не будет уникальным и случайным (в зависимости от режима шифрования), то безопасность шифра сломается.
Вопрос: Нужно ли скрывать IV?
Ответ: Нет, IV не является секретом и может передаваться вместе с зашифрованными
данными, это просто часть строки.
Вопрос: Зачем тогда нужна функция отделения IV?
Ответ: Если вы не планируете работать с шифрованными данными в других местах,
то вам она,
пожалуй, и не нужна. Но если планируете, то при дешифровке на уровне API вы, вероятно, передаете IV отдельным параметром, и вам
может быть удобнее сразу иметь его отдельным параметром, чтобы дополнительно каждый раз не резать набор данных.
Вопрос: Где лучше хранить IV?
Ответ: На ваше усмотрение. Можно в строке, можно передавать его рядом
с зашифрованным текстом,
но в другом аргументе (например, в json формате: {cipher:"encrypted_text",iv:"unic_iv"}).
Никогда не используйте один и тот же IV повторно! Это ломает безопасность.
Итак, в процессе шифрования генерируется IV, который по вашему желанию может быть либо записан в начало строки, либо выведен отдельно.
Поскольку IV - это просто блок данных, вы сами можете вырезать его из получившейся строки или вставить в начало, если они у вас разделены. Если
вы разделяете IV и шифр, то не забудьте при дешифровке вставить его в соответствующее поле (либо в начало строки). Помните, что nonce - 12 байт, а все
остальные - 16 байт. Удачи.
Асимметричное шифрование
Для асимметричного шифрования представлен только 1 режим - RSA-OAEP. При его выборе вы можете обратить внимание, что интерфейс сайта
немного поменялся. Помимо типа шифрования теперь вам так же нужно будет выбрать хэш вашего ключа.
Выбранный хэш будет применен и к ключам в шифраторе, и к создаваемым ключам.
Важно: запомните, какой хэш вы выбрали при создании ключей и
всегда указывайте его верно
Немного теории.
Для асимметричного шифрования характерно наличие 2-х ключей: публичного и приватного.
Публичный ключ не является секретом (на то он и публичный) и передается отправителю сообщения. Отправитель шифрует сообщение
вашим публичным ключом и отправляет зашифрованное сообщение вам. Публичный ключ НЕ МОЖЕТ расшифровать это сообщение,
операция шифрования публичным ключом для этого же ключа необратима.
Приватный ключ секретен и должен храниться только у вас. С его помощью вы расшифруете сообщение, зашифрованное публичным
ключом.
Такой тип шифрования обычно применяется для обеспечения безопасности при пердаче данных. Общая схема выглядит так:
допустим, есть собеседники A и B, оба создают по паре ключей - приватный и публичный - назовем эти ключи для собеседника
A: pubA и privA, а для собеседника B: pubB и privB.
Шаг 1. Создание ключей:
A создал ключи pubA и privA
B создал ключи pubB и privB
Собеседник A передает свой публичный ключ pubA собеседнику B, а B в ответ передает свой публичный ключ
pubB - A.
Иными словами, происходит обмен публичными ключами. Публичный ключи не являются секретными,
передавать их можно как угодно.
Шаг 2. Обмен публичными ключами:
A передает ключ pubA -> B
B передает ключ pubB -> A
С этого момента можно начинать общение. Предположим, что A пишет сообщение, шифрует его публичным ключом pubB
и отправляет B.
Собеседник B получает сообщение и, поскольку оно зашифрованно его публичным ключом pubB, он может расшифровать его своим
приватным ключом privB, что он и делает. Читает сообщение, пишет ответ, шифрует его публичным ключом pubA и отправляет его
своему коллеге A. Теперь уже A может расшифровать сообщение своим приватным ключом privA. Ну и так далее.
Шаг 3. Общение:
A шифрует сообщение ключом pubB -> отправляет B
B расшифровывает сообщение ключом privB -> читает текст
B пишет и шифрует ответ ключом pubA -> отправляет A
... и так, пока не надоест.
Так же публичный и приватный ключи используются для создания и проверки электронной подписи, но на странице такого функицонала нет,
так что опустим это.
Вопрос: Можно ли зашифровать сообщение приватным ключом?
Ответ: API, используемый на этой странице, не поддерживает такую операцию.
Однако, чисто технически такое возможно, на математическом уровне это сработает, но
это лишено смысла. Получается какой-то странный аналог электронной подписи.
Вопрос: Почему сообщение, зашифрованное публичным ключом не может быть
расшифровано этим же публичным ключом, а нужен именно приватный?
Ответ: Потому. Это если коротко. Чуть длиннее: односторонняя функция с
потайным входом. Объяснения для "гуманитариев" нет, придется немного посчитать. Но могу прямо максимально на пальцах. Хотите?
Ну давайте на простом примере. Значит, смотрите, идея в том, что параметров, которые содержатся в публичном ключе,
достаточно для шифрования, но недостаточно для расшифровки.
Пример:
Публичный ключ содержит параметры: n и e.
Приватный ключ содержит параметры: n, e и d.
Обратите внимание: публичный ключ НЕ ЗНАЕТ о параметре d.
И еще, самое важное: e не = d
Теперь смотрим на формулы, которыми мы будем шифровать: (cipher - это шифр, data - это начальные данные)
cipher = data^e % n
data = cipher^d % n
Это как бы парные функции. Входящее значение первой нельзя восстановить из нее самой, но можно воспроизвести во второй.
Далее я все покажу, не переживайте, пока просто читайте.
Обратите внимание, что в первом случае в степени стоит e, а во втором - d (параметр, о котором не знает публичный ключ).
% - это деление по модулю, но на калькуляторе эта кнопка обычно отвечает за вычисление процента,
не перепутайте, это не то, что вам надо. Так же вместо % используют mod, но я в педагогичеких целях буду писать %, мне кажется оно
выглядит не так страшно.
Деление по модулю - это взятие остатка от деления. Оно еще называется деление с остатком.
Пример:
9 % 3 = 0
10 % 3 = 1
11 % 3 = 2
12 % 3 = 0
Потому что:
9 = 3*3 + 0
10 = 3*3 + 1
11 = 3*3 + 2
12 = 4*3 + 0
То есть, когда мы делаем 10 % 3, мы ищем ближайшее меньше значение к 10, кратное 3. Это 9. 9 делится на 3 нацело.
А останется 10-9 = 1. То есть 10 % 3 = 1, потому что 1 - это остаток от деления на 3 нацело. Так работает оператор % (mod).
Представьте, что у вас 10 яблок, и вам надо поровну разделить их между 3-мя друзьями.
Но чтобы поровну (резать нельзя), вы можете только дать каждому другу по 3 яблока. И того, вы раздадите 9 яблок. Останется 1.
Можете съесть сами. Это и есть остаток от деления. Так же вы могли заметить, что, когда мы увеличиваем делимое на 1 - остаток меняется циклично,
в нашем случае: 0, 1, 2, 0, 1, 2, 0... И так будет происходить до бесконечности. Аналогия в реальной жизни - циферблат часов и стрелка.
Ну 10%3 - это понятно. Но что если 2%3?
Представьте, что у вас 2 яблока, и вам нужно поровну разделить их между 3-мя друзьями. Как это сделать? Никак.
Вы оба забираете себе, это и есть остаток. Какое ближайшее наименьшее значение является делителем 3? Ноль.
3 делится на 0 нацело, а 2-0 = 2 => 2%3 = 2
Но что если у нас отрицательные числа?
:-)
Давайте вернемся к шифрованию, а то итак уже с этими модулями...
Ладно. Пример с отрицательными числами разбирать не будем, потому что окажется, что % это не совсем mod, все зависит от
языка программирования, и в итоге все объяснение сломается. Так что будем наивно думать, что отрицательные числа нам просто не встретятся.
Теперь давайте уже что-нибудь зашифруем. Предположим, мы шифруем цифру 2. Параметры такие:
data = 2 (то что мы шифруем); n=33; e=3; d=7; (помним, что публичный ключ знает только n и e, а про d не слышал)
Тогда:
cipher = data^e % n = 2^3 % 33 = 8 % 33 = 8
(потому что 8 % 33 = 0*33 + 8)
Мы зашифровали цифру 2 параметрами публичного ключа и в качестве шифра получили цифру 8.
Что будет, если мы решим расшифровать наш cipher теми же параметрами от публичного ключа? Давайте посмотрим:
Функция cipher = data^e % n необратима, ведь если мы сделаем:
8 = data^3 % 33
то столкнемся с тем, что data может принимать бесконечное количество значений, так как деление по модулю дает
цикличный результат. По сути data^3 может быть равно 8, 41, 74, 107... и так далее +33.
И единственная возможность найти загаданное число - обратиться к нашей парной функции, которая из-за того, что мы при создании ключей
подобрали такие параметры n, e и d, позволяет воспроизвести нужный нам результат.
data = cipher^d % n
Но параметр d публичный ключ не знает.
Если мы расшифровываем публичным ключом, то нам ничего не остается, кроме как подставить вместо d
параметр e.
data = 8^3 % 33 = 17
Как мы видим, получилось 17, а это неправильный ответ. Шифровали-то мы цифру 2. Больше у нас параметров для подстановки нет
(от безысходности можно попробовать подставить параметр n, но это тоже не поможет), мы в тупике.
Зная только n и e, мы не можем обратить шифр, нам нужен d.
А теперь попробуем расшифровать приватным ключом, который знает, что d=7
data = cipher^d % n = 8^7 % 33 = 2
Получилось 2. То, что мы и шифровали. Проверяйте на калькуляторе.
В чем серект? Как вы уже поняли, секрет в делении по модулю. Из-за того, что результат такого деления при изменении делимого
цикличен, восстановить делимое по результату нельзя. Например:
x % 3 = 2
x = 5, 8, 11, 14... Все это может быть в x, что там было точно мы не знаем.
Но можем заранее подобрать параметры, которые потом этот результат воспроизведут. Это и происходит при создании ключей.
Это если коротко. За более подробной информацией обращайтесь в тематические источники, их много.
Вопрос: Какие настройки для шифрования выбрать?
Ответ: Зависит от вашей задачи.
Если четкой задачи нет, то используйте настройки по умолчанию: длина ключа - 3072, хэш - SHA-256.