Security design
Locked on one phone,
opened on another.
Posts, photos and chats are sealed on your phone before they leave it, and only the people you choose can open them. Who you know is kept on your phones, and our server doesn’t store it.
01 Sealing
Only the people you choose
can open it
When you post, your phone seals it before it leaves. Our server stores and delivers the sealed post, with no key to open it. Replies, photos, videos and link previews travel the same way.
The writer’s phone makes a new content key just for this post, inside its security core.
It locks the text, photos and videos with that key. Text is first padded to a set size, so its exact length doesn’t show.
It seals the content key to each reader’s encryption key, making one envelope per reader. The writer gets one too.
The server stores the ciphertext and envelopes and passes them on to readers. The key that opens an envelope is only on that reader’s phone, so the server can’t open them.
The reader’s phone opens its own envelope inside its security core and takes out the content key.
It unlocks the post with that key and shows it on screen.
- Ciphertext is all our server holds
- Posts, replies, photos, videos and link previews are locked before they reach our server.
- An envelope for each reader
- The key to a post goes into a separate envelope for each reader, and only that reader’s phone can open it.
- A new key for every post
- Every post and every reply gets its own key. The key to one won’t open another.
- Your phone decides who receives it
- Your phone seals each post for the Fam list it keeps itself. Only people who accepted a request or connected by QR code or Fam link get on that list. A Fam link you send works once within 24 hours, and the first person who opens it becomes your Fam without you confirming. Sending the link is your consent.
Posts are locked with XChaCha20-Poly1305. Each envelope is sealed with X25519 and carried inside the pair’s secret, which is shared with X25519 and ML-KEM-768 together.
02 Relationships
Who you know
stays on your phones
Your Fam list is sealed on your phones, and our server doesn’t store who brought whom in or who sent what to whom. Sealed items travel through mailboxes that aren’t tied to any account. In the moment a request arrives, though, our server does see its IP address and time, which can link a mailbox to an account. For people the Krypton Ø team lets in directly, the server keeps that the team let them in.
- A secret only two phones share
- When two people become Fam, their phones share a secret our server never sees. Everything between them finds its way with it.
- Mailboxes, not accounts
- Posts, chats and cards go into mailboxes that aren’t tied to any account, and mailbox numbers change every 30 days.
- The sender is inside the seal
- Who sent each item is sealed inside it with a signature, and the receiving phone checks that signature.
- Invitations kept off the record
- Members receive invitations our server issues without seeing them. When someone joins, our server checks only that the invitation is genuine. Its stored records don’t say who brought whom in, though connection logs and live requests can show it.
Pair secrets are sealed with X25519 and ML-KEM-768 together, mailbox keys are derived with HKDF-SHA256, and senders sign with Ed25519.
03 Keys
Your keys live
on your phone
Your private keys are kept in the security core on your phone, shared by the iPhone and Android apps. Not even the app code that draws the screen gets them.
- Handles
- Unlocked posts and photos
Private keys never cross
- Four private keys
- Content keys
- Private keys, locked
- This phone only
- Public keys
- Locked recovery backup
- Recovery half · locator hash
- This phone only
- Kept in the iPhone Keychain or the Android Keystore, and never carried to another phone by a backup. A new phone gets them back only through recovery.
- The app sees only handles
- The core gives the app a handle instead of a key. On its own, outside the app, a handle unlocks nothing.
- No phone number, no email
- You join and sign in with the keys on your phone alone. We don’t collect phone numbers or email addresses.
- Widely used standards
- No home-made cryptography: widely used standards, implemented by the Rust libraries dalek and RustCrypto.
- X25519
- ML-KEM-768
- Ed25519
- XChaCha20-Poly1305
- HKDF-SHA256
- BIP39
04 Recovery
Lose your phone,
not your account
Set a PIN and write 18 English words on paper. You can do this when you join or later in Settings. On a new phone, once the words and your PIN check out, your account comes back.
- Words only on your paper
- We show the 18 words once, when you make them, and ask you back for some of them. You can make them when you join or later in Settings. The words aren’t kept on our server, in any cloud or on your phone, and we never show them again.
- Both the words and your PIN
- Neither the words nor the PIN opens it alone. The PIN locks after a few wrong tries, and our server finds your account by a hash of a one-way value made from the words, never the words themselves.
- Time to stop it
- Recovery completes after a 48-hour wait. In the meantime, your old phone sees the request and can cancel it.
- What our server holds isn’t enough
- The secret that opens your backup comes in two halves: one on our server, the other in the words on your paper. Even taking our whole server won’t open it without the words.
The words are 18 BIP39 standard words, 192 bits. Even a quantum computer would need 2⁹⁶ guesses. The two halves are combined with HKDF to open the backup.
05 Calls
Calls that stay
between the two of you
Talk with your Fam by voice. Your voice is encrypted between the two phones, and call history stays on each phone.
- Only your Fam can call
- A call rings, sealed, through the mailbox only the two of you share. Our server doesn’t record who calls whom.
- Only the receiving phone knows who’s calling
- The receiving phone unseals who’s calling and shows it on the ring screen. Our server doesn’t know the caller’s name.
- A relay that hides your IP address
- Calls usually connect through a relay. The relay sees both phones’ IP addresses but can’t open the encrypted audio, and the person you call doesn’t see your IP address. If a phone can’t get the relay details, the two phones connect directly, and then each can see the other’s IP address.
- Signed by both phones
- Each phone signs the connection details with its own key. If anything is swapped in the middle, the call doesn’t connect.
Connection details are signed with each person’s Ed25519 account key.
06 Your controls
You decide
what shows
Lock the app, choose who sees your card, and keep what’s on your screen on your screen.
- App lock
- Lock Krypton Ø with your phone’s face or fingerprint unlock, or its passcode. It can lock right away, or after you’ve been away for 1, 15 or 60 minutes. While it’s on, the app switcher shows nothing inside. The setting stays on your phone; our server doesn’t know whether you use it.
- Who sees your card
- Your card is sealed. Choose Fam only or Everyone. Either way, your full photo goes only to your Fam. Narrow it any time and your phone seals the card again with a new key.
- No screenshots
- The screens you view in Krypton Ø can’t be captured or recorded.
- Posts that disappear
- Make a post disappear, and 24 hours after it appears the post, its chat and its photos are gone.
07 Quantum-safe
Hard to break,
even for quantum computers
Some attackers collect ciphertext today, hoping to open it with a quantum computer later. In the outer layer that hands keys to the people you choose, Krypton Ø uses today’s proven encryption (X25519) and post-quantum encryption (ML-KEM-768) together.
- Both have to be broken
- The secrets from both are combined into one before sealing. If a weakness turns up in one, the other still holds. It’s the same hybrid approach Signal and iMessage chose.
- Every outer layer, sealed with both
- Every outer layer that hands over keys is sealed with both: Fam requests and the notes that set up each pair’s shared secret, sealed backups, recovery, invitation bundles and reports. Posts and chats inside pair mailboxes are wrapped with the pair’s 256-bit secret, shared this way.
- Public keys that can’t be swapped
- The post-quantum public key is bound to your account signature too. If our server or anyone in between swaps in another key, the signature fails and the phone rejects it.
- Content locks stay strong
- The 256-bit XChaCha20-Poly1305 that locks posts and photos, and SHA-256, keep enough strength against quantum computers that they don’t need to change.
The outer layer is sealed with X25519 and ML-KEM-768 (US NIST standard FIPS 203) together, and the two secrets are combined with SHA3-256.
Still moving over
- Signatures (Ed25519) aren’t post-quantum yet. A forged signature can’t open anything from the past. Every account already has an ML-DSA (FIPS 204) signing key, created when you join and bound to your identity, and we plan to turn on signatures that use it alongside Ed25519 before practical quantum computers look likely.
- Anonymous invitations keep hiding whose they were, even against quantum computers. The part that keeps them from being forged moves over along with signatures.
- Call audio is encrypted between the two phones with the WebRTC standard, which isn’t post-quantum yet.
08 Bots
A bot’s key
never reaches our server
KryptonØ+ members can make send-only bots that post messages and photos into group chats they’re in. A bot’s keys are made on its owner’s phone and exported as a file, and the owner runs the bot on their own server. We didn’t build a way for our server to run bots for you, because then it could read the chats bots are in.
- Keys made on the owner’s phone
- The security core writes the bot’s keys straight into a key file. The owner exports it, and the phone’s copy is deleted. Our server holds only the bot’s public keys, and the file doesn’t contain the owner’s own keys.
- Our server doesn’t know whose bot it is
- A bot is made without signing in, using an anonymous KryptonØ+ ticket, and the key that manages it isn’t linked to the owner’s account key. Our server knows how many bots there are, their public keys, when each was made and how many messages each posts a day. The app picks up the ticket ahead of time so our server can’t match it to the new bot by time, though the very first time it still can.
- Only in the owner’s chats, labeled
- A bot joins only group chats its owner is in, after the owner confirms once, and phones drop a bot that anyone else adds. A “Bot” label appears wherever its name does, and you can’t call a bot or send it a Fam request. When the owner leaves, the bot leaves too. A bot’s posts carry its own session so the daily limit can be counted. Our server can see which chat tag (a random number) a bot posts to, but not who owns the bot or what it says.
- The owner can read those chats
- Whoever runs a bot holds the secret of each chat it’s in, just like anyone in that chat. Our bot runner doesn’t fetch messages, but a modified one could read them. That’s why a bot joins only chats its owner is in, and wears a label so everyone knows it’s there.
A bot has the same kinds of keys as a member: Ed25519 and ML-DSA-65 for its identity, X25519 and ML-KEM-768 for sealing. Each bot carries a certificate its owner signs with their Ed25519 account key, and on our server its posts look like any other.
What no app can protect
- A photo someone saves to their own camera roll, or a camera pointed at the screen
- Someone you hand your unlocked phone to
- A modified app, used to pull out what its owner received
- A recording the other person makes of a call
- A phone already taken over by malware
- Someone watching the network linking mailboxes, calls or sign-ups to an account by IP address and time. Krypton Ø doesn’t send requests through a relay that hides IP addresses
- A modified app ignoring rules kept on the device. Rules like blocks and the limit on passing posts to Fam are enforced by the receiving app, not by our server
- A leaked secret between you and one Fam. It doesn’t change over time, so the pair’s sealed notes still on our server (up to 90 days) could be opened
A full technical description will be published on GitHub.