Шифр Вернама
Введите текстовое сообщение или перетащите текстовый файл без ограничений по языку, размером до 1 МБ.
Какие файлы создаёт страница
Имена файлов содержат одинаковый идентификатор. Он помогает подобрать правильную пару. Сам идентификатор секретом не является.
Как зашифровать и сохранить сообщение
- Откройте режим «Шифрование».
- Введите или вставьте сообщение в левое поле. Можно также перетащить в него файл
.txtв кодировке UTF-8. - Нажмите «Зашифровать».
- Скачайте два файла: файл V3C с шифротекстом и файл V3K с ключами. Одинаковая дата и идентификатор в именах показывают, что файлы относятся к одному сообщению.
- Сделайте несколько резервных копий каждого файла, чтобы случайная поломка устройства не уничтожила сообщение.
- Разнесите копии. Например, V3C можно хранить в обычном облачном архиве и на компьютере, а V3K на зашифрованной флешке и в защищённом хранилище другого облачного аккаунта.
Как передать сообщение другому человеку
- Передайте V3C обычным способом, например через мессенджер или электронную почту.
- Передайте V3K другим независимым способом. Подойдут личная передача флешки, другой сервис с отдельной учётной записью или заранее защищённое хранилище.
- Не пересылайте V3C и V3K одним письмом, в одном чате, через один облачный аккаунт или на одном носителе.
При надёжном скрытом хранении всех копий V3K шифротекст V3C можно передавать открыто, однако другой человек при необходимости всё равно сможет увидеть факт передачи, размер файла, дату и идентификатор.
Как прочитать сообщение
- Откройте режим «Расшифровка».
- Перетащите файл V3C в левое поле «Пакет шифротекста V3C».
- Перетащите парный файл V3K в правое поле «Пакет ключа V3K».
- Нажмите «Расшифровать».
- Если файлы подходят друг к другу и не были изменены, ниже появится исходный текст.
- Чтобы сохранить восстановленный текст, нажмите под ним «Скачать .txt».
Что делать с ключом после использования
- Каждый V3K относится только к одному сообщению. Никогда не используйте его для шифрования другого текста.
- Пока сообщение нужно хранить или расшифровывать повторно, сохраняйте резервные копии V3K в разных защищённых местах.
- После окончательной расшифровки, когда восстановление сообщения больше не требуется, уничтожьте все копии V3K. Проверьте флешки, облака, загрузки, корзины, резервные копии и историю пересылок.
- После уничтожения последнего V3K восстановить текст из V3C будет невозможно.
Как очистить страницу
Нажмите «Очистить поля и буфер». Страница удалит текст из своих полей и попробует очистить системный буфер обмена. Если браузер запретит очистку буфера, очистите его вручную, скопировав любой несекретный текст.
Короткая памятка
- V3C можно показывать и пересылать открыто, пока V3K остаётся тайным.
- V3K нельзя публиковать, отправлять вместе с V3C или хранить рядом с ним.
- Для каждого сообщения нужен новый V3K.
- Утрата V3K делает расшифровку невозможной. Кража V3K снимает защиту с соответствующего V3C.
- Страница не защищает заражённый компьютер, историю буфера обмена, снимки экрана и копии файлов вне браузера.
Инструкция для технического специалиста
Криптографическая схема
Страница реализует схему, близкую к одноразовому блокноту и шифру Вернама. Исходная строка кодируется в UTF-8. Для каждого байта создаётся один случайный байт ключа. Шифрование выполняется операцией XOR, то есть арифметикой по модулю 2: C = P XOR K. Расшифровка повторяет XOR: P = C XOR K.
Совершенная секретность одноразового блокнота доказуема только при равномерно случайном ключе, равном сообщению по длине, сохранённом в тайне и использованном ровно один раз. Эта страница получает байты через crypto.getRandomValues(), то есть через криптографически стойкий генератор браузера и источник энтропии операционной системы. Такой генератор подходит для практического применения, однако код не доказывает физическую истинную случайность. Поэтому математическую абсолютную стойкость заявлять нельзя.
Формирование ключа и шифротекста
TextEncoderпреобразует исходную строку в точную последовательность байтов UTF-8.crypto.getRandomValues()создаёт одноразовый XOR-ключ той же длины, 32-байтный ключ HMAC и 16-байтный идентификатор записи.Math.random()не используется.- Каждый байт текста объединяется с соответствующим байтом ключа операцией XOR.
- Двоичные значения переводятся в Base64 с URL-безопасным алфавитом. Base64url служит транспортным представлением и сам по себе ничего не шифрует.
Формат V3K и V3C
Префикс V3K: обозначает секретный пакет версии 3. Его JSON-полезная нагрузка содержит версию v, идентификатор id, одноразовый ключ otp и отдельный ключ проверки целостности mac.
Префикс V3C: обозначает пакет шифротекста версии 3. Он содержит версию v, тот же идентификатор id, шифротекст ct и метку tag. Расширение .txt не меняет формат: оба файла содержат обычный текст.
Почему лимиты исходного текста и V3K отличаются
Слева показан исходный текст: максимум 1 МБ в кодировке UTF-8.
- Справа показан весь пакет V3K: максимум 2 000 000 текстовых символов.
- Сам одноразовый XOR-ключ имеет ровно столько байтов, сколько занимает исходный текст. Для текста размером 1 МБ ключ тоже равен 1 МБ.
- Пакет V3K дополнительно содержит идентификатор, ключ HMAC, JSON-структуру и Base64url-кодирование. В текущем формате двоичный ключ сначала кодируется в Base64url внутри JSON, затем весь JSON снова кодируется в Base64url.
- Поэтому пакет из ключа размером 1 МБ занимает примерно 1,86 млн символов. Предел 2 млн оставляет запас для служебных данных.
Проверка целостности
Страница использует HMAC-SHA-256 с независимым 256-битным ключом. Метка вычисляется для строки V3|id|otp|ct. При расшифровке идентификаторы сначала сопоставляются, затем HMAC проверяется через Web Crypto API. XOR и декодирование UTF-8 выполняются только после успешной проверки.
HMAC обнаруживает повреждение и подмену, пока V3K остаётся секретным. Получив V3K, злоумышленник узнает XOR-ключ и ключ HMAC, поэтому сможет прочитать сообщение и сформировать новую корректную метку. HMAC подтверждает владение секретом, а не личность отправителя.
Ограничения и модель угроз
- Повторное применение одного XOR-ключа к двум сообщениям раскрывает XOR открытых текстов и разрушает основное свойство одноразового блокнота.
- Идентификатор связывает пару файлов, однако не является секретом и сам по себе не доказывает подлинность.
- Код не защищает от вредоносных расширений, кейлоггеров, снимков экрана, чтения буфера обмена и компрометации устройства.
Локальная обработка
Шифрование, расшифровка и генерация ключей выполняются JavaScript-кодом в браузере. Приложение не отправляет введённые данные на сервер, не использует cookies, localStorage или аналитику.