Шифратор


Настройки:

Тип шифрования:

Симметричное:

Асимметричное:

Хэш-функция:

Внимание: при смене режима шифрования все поля, кроме начального текста, будут очищены


Формат данных


Создание ключа

Длина ключа:

Длина ключа:

Публичный ключ

Приватный ключ



Рабочее пространство

Шифрование строки

Начальные данные:

Результат:

Ключ:

Генерировать IV/nonce/counter:

(IV будет помещен сюда после генерации)

Где хранится IV/nonce/counter:

(IV будет помещен сюда после шифрования)

Публичный ключ:

Приватный ключ:



Вычисление хэша строки

Начальные данные (строка):

Результат (hex/base64):

Конвертер hex-base64

Начальные данные (hex/base64):

Результат (base64/hex):



Информация:

Основные положения

На странице представлены инструменты для шифрования, вычисления хэша строки и конвертации строки из hex в base64 и обратно.

С хэшем и конвертером, надеюсь, все более-менее понятно (вставьте исходную строку в поле для начальных данных и нажмите кнопку)

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

Так же предлагается выбрать формат данных: hex или base64. В этом формате будут выдаваться/приниматься ключи и результат вычислений. Исходные данные для вычисления хэша, шифрования и результат дешифровки - обычные символы.

Симметричное шифрование

Для симметричного шифрования используется алгоритм AES в 3-х режимах: CTR, CBC и GCM. При создании ключа не забудьте указать его размер. Куда вставлять ключ и данные для шифрования - разберетесь.

В отдельном поле вы можете сгенерировать IV/nonce/counter или подставить собственное значение, по умолчанию генерация осуществляется автоматически.

Так же при шифровании можно выбрать место хранения IV/nonce/counter. По умолчанию, он записывается в начало строки полученного шифра, но вы можете вынести его отдельной строкой в соответствующее поле. Если вы его вынесли отдельно, для расшифровки его снова надо будет добавить в это же поле, либо просто вставить в начало строки шифра (и нажать соответствующий переключатель).

Асимметричное шифрование

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

Важно: запомните, какой хэш вы выбрали при создании ключей и всегда указывайте его верно

Для асимметричного шифрования характерно наличие 2-х ключей: публичного и приватного.

Публичный ключ не является секретом и передается отправителю сообщения.

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

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

Общение выглядит так: собеседники меняются публичными ключами и шифруют ими сообщения друг другу. Сообщение расшифровывается получаетелем с помощью его приватного ключа (который был создан в паре с публичным).

Ответы на вопросы.

(кликните на вопрос, чтобы развернуть ответ)

Общие вопросы:

Вопрос: Какие технические средства используются для релизации функционала страницы?

Ответ: Стандратный Crypto-API браузера.


Вопрос: Какой формат выбрать, hex или base64?

Ответ: Если не знаете, что все это такое - выбирайте hex.

По сути, и то и другое - это строка. Разница в том, что hex будет значительно длиннее, но он более надежен в плане контроля символов. Да, base64 компактнее, и он, пожалуй, чаще выступает основным стандартом для API, но он содержит спецсимволы (+, /, =), которые обязательно сломают вам жизнь, если вы начнете вставлять эту строку в различные места без предварительного экранирования.

В общем, base64 - это если вы понимаете, что делаете, нужна совместимость с какими-то другими API, либо важно получить более компактный результат, и вы не планируете вставлять его в разные интересные места (либо планируете, но готовы ко всему).

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


Вопросы по симметричному шифрованию:

Вопрос: Что такое AES? И в чем разница между разными режимами AES-шифрования? Какой лучше выбрать?

Ответ: AES - Advanced Encryption Standard - это блочный алгоритм шифрования, который делит ваши данные на блоки равной длины и обращает их в нечитаемый шифр.

CBC, CTR и GCM - это схемы, по которым алгоритм будет работать с блоками ваших данных.

  1. CBC - данные разбиваются на блоки, каждый блок данных при шифровании смешивается с предыдущим блоком (получается такая детерминированная цепочка блоков).
  2. CTR - идея та же, но обрабатывается не по целым блокам, а как поток данных.
  3. GCM - работает, как CTR, но добавляется аутентификация (в остальных нужен HMAC).

Я не знаю, сказало ли вам хоть что-то это объяснение, но коротко и понятно в рамках вопрос/ответ, это так просто объяснить не получится. Это плохая новость.

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


Вопрос: Какую схему AES-шифрования выбрать?

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

Если это так, то выбирайте AES-GCM, размер ключа 256, а IV храните в строке. По сути, просто оставьте настройки по умолчанию.

Почему именно это?

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

Ну и вам же надо что-то выбрать, вот я за вас выбрал.

Но если хотите более серьезный ответ, то в целом GCM мне видится наиболее предпочтительным при прочих равных. Даже если ваши цели выходят за рамки бытовых задач, он все равно скорее всего подойдет вам.


Вопрос: Что такое IV/nonce/counter?

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

Вообще, по сути, это просто случайный блок данных, ничего страшного.

В разных схемах этот блок называется по-разному.

  • CBC - IV (Initialization Vector) - вектор инициализации, общий термин для обозначения начального блока в криптографических алгоритмах.
  • GCM - Nonce - Number used once - одноразовый номер, который гарантирует уникальность сессии шифрования (и самого шифра). Так же добавляется к шифруемым данным. Он обязательно должен быть уникальным, но не обязательно каждый раз случайным, вполне может быть последовательным (по типу, как 1, 2, 3...), если этот процесс контролируется системой.
  • CTR - Counter - счетчик. Для простоты можно сказать, что это расширенный nonce (что не совсем корректно, но в нашем случае ок), но если nonce - это уникальный номер всей сессии шифрования, то counter - это только наполовину nonce: первая половина - это уникальный номер сессии, а вторая половина будет меняться в зависимости от номера шифруемого блока. То есть, nonce уникален для всей сессии в целом, а counter не просто для сессии, но и для каждого блока.

Но вообще все это можно называть просто IV. Можно даже сказать, что counter и nonce - это частные случаи IV.

В рамках данного инструментария отличаются они только тем, что IV и counter имеют размер 16 байт, а nonce - 12 байт. В остальном, они даже генерируются одинаково.

Но это только здесь так. Так-то существуют некоторые нюансы, просто мы их здесь не реализуем.


Вопрос: IV это просто часть строки?

Ответ: В нашем случае, если вы выбрали хранить IV в строке, - да. Это просто кусок в самом начале строки.

Его можно вырезать из строки или вставить в начало, если его там нет. Просто через Ctrl-C Ctrl-V.

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

Попробуйте сделать это, чтобы увидеть, как это работает.


Вопрос: Зачем нужен IV?

Ответ: В наших алгоритмах шифривание каждого следующего блока в наборе данных детерминировано результатом шифрования предыдущего. Таким образом достигается исключение повторяющихся фрагментов в структуре шифра на одинаковых участках в одном наборе данных. Без этого один и тот же блок выдавал бы один и тот же фрагмент шифра, что снижало бы безопасность.

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

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

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

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

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


Вопрос: IV генерируется случайно? Можно ли в качестве IV использовать собственное придуманное значение?

Ответ: В нашем случае IV генерируется всегда случайно.

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


Вопрос: Нужно ли скрывать IV?

Ответ: Нет, IV не является секретом и может передаваться вместе с зашифрованными данными, как часть строки.


Вопрос: Зачем тогда нужна функция отделения IV?

Ответ: Если вы не планируете работать с шифрованными данными в других местах, то вам она скорее всего и не нужна. Но если планируете, то при дешифровке на уровне API вы, вероятно, передаете IV отдельным параметром, и вам может быть удобнее сразу иметь его отдельным параметром, чтобы дополнительно каждый раз не резать набор данных.


Вопрос: Где лучше хранить IV?

Ответ: На ваше усмотрение. Можно прямо в строке (это удобно), можно передавать его рядом с зашифрованным текстом, но в другом аргументе (например, в json формате: {cipher:"encrypted_text",iv:"unic_iv"})


Вопросы по асимметричному шифрованию:

Вопрос: Можно ли зашифровать сообщение приватным ключом?

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


Вопрос: Почему сообщение, зашифрованное публичным ключом не может быть расшифровано этим же публичным ключом, а нужен именно приватный?

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

Пример:

Публичный ключ содержит параметры: n и e.

Приватный ключ содержит параметры: n, e и d.

Обратите внимание: публичный ключ НЕ ЗНАЕТ о параметре d.

И еще, самое важное: e != (НЕ равно) d

Теперь смотрим на формулы, которыми мы будем шифровать: (cipher - это шифр, data - это начальные данные)

cipher = data^e % n

data = cipher^d % n

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

% - это деление по модулю, так же вместо этого знака еще используют mod.

Деление по модулю - это взятие остатка от деления. Оно еще называется делением с остатком. Например: 10 % 3 = 1, т.к. ближайщее к 10 целое делимое для 3 это 9 и 10-9 = 1. Еще примеры: 11 % 3 = 2, 12 % 3 = 0.

Давайте для примера зашифруем цифру 2. Параметры такие:

data = 2 (то что мы шифруем);

n=33; e=3; (параметры публичного ключа)

d=7; (дополнительный параметр приватного ключа, которого нет в публичном)

Тогда:

cipher = data^e % n = 2^3 % 33 = 8 % 33 = 8

Мы зашифровали цифру 2 параметрами публичного ключа и в качестве шифра получили цифру 8.

Что будет, если мы решим расшифровать наш cipher теми же параметрами от публичного ключа? Давайте посмотрим:

Функция cipher = data^e % n необратима, ведь если мы сделаем:

8 = data^3 % 33

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

И единственная возможность найти загаданное число - обратиться к нашей парной функции, которая из-за того, что мы при создании ключей подобрали такие параметры 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. То, что мы и шифровали.

Надеюсь, принцип понятен.


Вопрос: Какие настройки для шифрования выбрать?

Ответ: Если конкретных требований нет, то используйте настройки по умолчанию: длина ключа - 3072, хэш - SHA-256.



Вверх