Skip to content

Kryptos 2.3

Choose a tag to compare

@swisslite swisslite released this 03 Aug 18:34
· 25 commits to main since this release

What is new

  • Panic password. A second password that, instead of unlocking Kryptos, wipes everything for good: profiles and private keys, chats, contact keys, PGP keys, the words the keyboard has learned, caches and settings. Afterwards the app opens empty, as if freshly installed. Set it in Privacy. It replaces the old panic PIN and can now be any password, not only digits.
  • App passcode. An ordinary code to unlock the app when you would rather not use biometrics. Both codes are typed into the same field, so the field itself tells nobody whether a panic password exists.
  • Key backup. Your own keys, your contacts' keys and your PGP keys go into a single password protected file that restores on another phone. It is encrypted with Argon2id and AES-256-GCM and looks like random data from the outside. Chats are not included.
  • Interface settings. Theme, an app language independent of the system one, and bottom tabs that can be switched off individually.
  • In-app help. A walkthrough built from real screenshots plus an FAQ, in Settings.
  • A compose field button on the keyboard itself, in sync with Settings both ways and hideable.
  • Source code section in About linking to this repository; contacts moved into a separate Developer section.

Cryptography

  • A password is turned into a key with Argon2id (64 MiB, t=3, p=1, the RFC 9106 profile). PBKDF2 is gone from the project entirely: password mode, photo steganography and the lock screen codes all derive through Argon2id.
  • The two implementations, the PHC reference library on iOS and BouncyCastle on Android, are checked against all seven official Argon2id test vectors and give byte-identical results, so a message crosses between the platforms unchanged.
  • Photo steganography rebuilt. No visible signature and no length at fixed positions, bits go only into textured areas of the picture with LSB matching, positions are spread by a keyed stream and the length is masked. A wrong password and a photo with nothing in it are indistinguishable.

On-screen decryption (Android) and the keyboard

  • The main fix: in real messengers on-screen decryption often found no messages at all, because their text is marked as unimportant for screen readers. It finds them now.
  • The decrypted text appears exactly where the ciphertext is, centred on it and as wide as it, instead of a small window pinned to the top left corner.
  • The panel no longer rebuilds itself in a loop, it disappears about 300 ms after you leave a chat, and it does not show up for a message that has scrolled off the screen.
  • The expand button was redone and appears when the text is really cut off rather than when it is long.
  • The decryption window on the keyboard was rebuilt: the contact's name in the title, even padding and corners, and long text scrolls inside the window without closing it.

Security

  • Erasing data and the panic password really do clear the settings now. The settings file used to survive untouched.
  • Code hashes live in encrypted storage and are destroyed by the wipe itself, so nothing is left to show that a code was ever set.
  • Checking a code on the lock screen takes the same time whatever codes exist, so the response time cannot reveal whether a panic password is set. After a few wrong tries the delay grows to 30 seconds.
  • The wipe destroys the storage key first, so a wipe interrupted halfway leaves data that nothing can decrypt any more.
  • The clipboard now clears itself in the background. It used to work only while the app was open.
  • Key backup refuses to export at all if any part of the keys cannot be read, and identifiers from an imported file are validated before they become names in storage.
  • The app signature check now fails closed, and strict biometrics is requested where the system supports it.

Fixes

  • Critical: after a screen lock was removed the app could fail to start at all, because the system destroys the hardware key. It now shows a recovery screen with an explanation and a reset button.
  • Disappearing messages got a live timer, and expired messages are cleared from the keyboard and on-screen caches too.
  • Fixed a memory leak in the screen scanner, a race during the wipe, and a crash when hardware storage failed mid-wipe.
  • Typing no longer redraws the whole chat screen, and the device integrity check moved off the main thread.

Upgrading from an older version

  • Messages encrypted with a password before 2.2 and stego photos made before 2.3 can no longer be opened. Both formats changed completely.
  • A panic PIN set in an older version is erased by this update and has to be set again as a panic password.
  • Chats, contacts, identities and PGP keys carry over untouched.
  • iOS only: sign the .ipa with the same certificate as your previous install, otherwise the keychain access group changes and Kryptos comes up as a fresh install.

Русская версия

Новое

  • Пароль-ловушка. Второй пароль, который вместо разблокировки Kryptos безвозвратно стирает всё: профили и закрытые ключи, переписку, ключи контактов, PGP-ключи, выученные клавиатурой слова, кэши и настройки. После срабатывания приложение открывается пустым, как после установки. Задаётся в разделе «Конфиденциальность». Заменяет прежний паник-PIN, теперь это произвольный пароль, а не только цифры.
  • Код приложения. Обычный код для входа, если не хочется пользоваться биометрией. Оба кода вводятся в одно и то же поле, поэтому по самому полю нельзя понять, задан ли пароль-ловушка.
  • Резервная копия ключей. Свои ключи, ключи контактов и PGP-ключи выгружаются в один файл под паролем и восстанавливаются на другом телефоне. Файл зашифрован Argon2id и AES-256-GCM, снаружи неотличим от случайных данных. Переписка в копию не входит.
  • Настройки интерфейса. Тема, язык приложения независимо от системного и вкладки нижней панели, которые можно отключать по отдельности.
  • Встроенная помощь. Пошаговое руководство на реальных скриншотах и раздел вопросов и ответов в настройках.
  • Кнопка поля ввода прямо на клавиатуре, синхронизирована с настройками в обе стороны, при желании убирается.
  • Раздел «Исходный код» в «О программе» со ссылкой на этот репозиторий, контакты переехали в отдельный раздел «Разработчик».

Криптография

  • Пароль превращается в ключ через Argon2id (64 МиБ, t=3, p=1, профиль RFC 9106). PBKDF2 удалён из проекта полностью: парольный режим, стеганография в фото и коды на экране блокировки идут через Argon2id.
  • Две реализации, эталонная библиотека PHC на iOS и BouncyCastle на Android, сверены с семью официальными тестовыми векторами Argon2id и дают побайтово одинаковый результат, так что сообщение свободно переходит с платформы на платформу.
  • Стеганография в фото переделана. Нет открытой сигнатуры и длины в фиксированных местах, биты идут только в текстурные участки снимка через LSB matching, позиции распределяются ключевым потоком, длина маскируется. Неверный пароль и фотография, в которой ничего нет, неотличимы.

Расшифровка на экране (Android) и клавиатура

  • Главное исправление: в реальных мессенджерах расшифровка часто вообще не находила сообщений, потому что их текст помечен как неважный для озвучивания. Теперь находит.
  • Расшифрованный текст появляется ровно на месте шифртекста, по его центру и по его ширине, а не маленьким окошком в левом верхнем углу.
  • Панель больше не пересобирается по кругу, исчезает примерно через 300 мс после выхода из чата и не появляется для сообщения, уехавшего за край экрана.
  • Кнопка разворота полного текста переделана и появляется по факту обрезки, а не по длине сообщения.
  • Окно расшифровки на клавиатуре переделано: имя собеседника в заголовке, ровные отступы и скругления, длинный текст листается прямо в окне и прокрутка больше не закрывает его.

Безопасность

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

Исправления

  • Критично: после снятия блокировки экрана приложение могло не запускаться совсем, потому что система уничтожает аппаратный ключ. Теперь показывается экран восстановления с объяснением и кнопкой сброса.
  • У исчезающих сообщений появился живой таймер, а истёкшие сообщения вычищаются и из кэшей клавиатуры и экранной панели.
  • Устранены утечка памяти при обходе экрана, гонка при стирании и падение при сбое аппаратного хранилища во время стирания.
  • Набор текста больше не перерисовывает весь экран чата, проверка целостности устройства ушла с главного потока.

Обновление с прежней версии

  • Сообщения, зашифрованные паролем до 2.2, и стего-фото, сделанные до 2.3, больше не открываются. Оба формата сменились полностью.
  • Паник-PIN, заданный в прежней версии, стирается этим обновлением, задайте его заново уже как пароль-ловушку.
  • Переписка, контакты, ключи и PGP-ключи переносятся без изменений.
  • Только для iOS: подписывайте .ipa тем же сертификатом, что и прошлую установку, иначе сменится группа доступа к keychain и Kryptos откроется как свежеустановленный.

Downloads / Файлы

File For SHA-256
Kryptos.apk Android 8+, sideload a216ed97ef11da3f4ccfaa40cc66e2c4a1685e970b645be0e8ff26421cc01385
Kryptos.ipa iOS 17+, unsigned, sign it yourself 09b3f5bbb72e6dd79bcc09685231775ef89c91e4ee0fd951f3abf865192b0ead

Also available from https://datakeeper.pages.dev/kryptos.