Morbit cipher
With the key 568931724, MORE BITS becomes 32379749578158: the message is written in Morse, read two symbols at a time, and each of the nine possible pairs is replaced by a digit from 1 to 9. The same key decrypts it. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Text
- MORE BITS
- Key
- 568931724
- Calculation mode
- Encrypt
- Result
- 32379749578158
- Key source
- numeric
- Length
- 14
- Letters mapped
- 8
The Morbit cipher is a classical fractionated Morse scheme used in cryptogram clubs, Science Olympiad Codebusters, and geocaching puzzles. You first write the plaintext in International Morse code, separate letters with a slash and words with a double slash, then read the stream two symbols at a time. Each of the nine possible digrams of dots, dashes, and separators is replaced by a unique digit from one through nine according to a secret key. The result is a compact string of digits that looks nothing like Morse yet still carries the full message once the same key is applied in reverse. This capability accepts either a nine-digit permutation of one through nine or a nine-letter keyword whose alphabetical ranks build that permutation, then encrypts or decrypts deterministically in a pure parse worker with no network and no randomness.
How Morbit pairs Morse symbols into digits
Morbit sits between plain Morse and heavier fractionated systems such as Fractionated Morse. After the plaintext is converted to Morse, every letter is followed by a single slash separator and every word boundary becomes a double slash. The continuous stream therefore contains only three symbols: the dit written as a period, the dah written as a hyphen, and the separator slash.
Grouping those symbols two at a time yields exactly nine digrams: two dits, dit-dah, dit-slash, dah-dit, two dahs, dah-slash, slash-dit, slash-dah, and two slashes. The secret key is a permutation that assigns each digram a unique digit from one to nine. Encryption replaces every digram with its digit; decryption expands every digit back to its digram, then Morse-decodes the recovered stream.
If the Morse stream has odd length, a final pad slash is appended so pairing never leaves a singleton symbol. That pad is harmless on decrypt because empty letter tokens are ignored. Either form is accepted here so puzzle sheets that print keywords and tooling that stores digit tables both work without a separate conversion step.
Input contract, modes, and error behaviour
On encrypt, Latin letters A through Z and digits zero through nine are Morse-coded case-insensitively; runs of whitespace become word separators; other punctuation is skipped so pasted slogans still work. On decrypt, only digits one through nine are allowed after spaces are stripped—digit zero never appears in classical Morbit and is rejected. The key must be either exactly nine characters that are a permutation of digits one through nine with no repeats and no zero, or exactly nine Latin letters whose ranks become that permutation.
Decrypt that expands to unknown Morse tokens under the supplied key also fails rather than returning garbage letters. Successful responses echo mode, the normalised numeric key, optional keyword when a letter key was used, the result string, lengths, letter and word counts, the intermediate Morse stream for teaching, the fixed digram list, and a short formula string.
Example: text MORE BITS with key five six eight nine three one seven two four (or keyword MORSECODE) encrypts to the digit string three two three seven nine seven four nine five seven eight one five eight, and decrypting that ciphertext with the same key recovers MORE BITS.
Where the Morbit cipher comes in handy
Classroom Codebusters coaches and cryptogram editors need a deterministic Morbit oracle that never invents a tenth digram and never silently accepts a zero in the ciphertext. Puzzle generators for geocaches and escape rooms want to mint digit ciphertext from a known keyword and verify that reverse decoding restores the same phrase before packaging a cache page. Failed validation does not consume balance.
Keep requests under the character limit, store the numeric key form in tests even when users type keywords, and you get reproducible Morbit encrypt and decrypt for teaching, LMS plugins, and edge workers without maintaining your own Morse tables.
What you can do with it
Geocache and puzzle generation
Mint Morbit digit ciphertext for field puzzles and verify decrypt restores the intended phrase before publishing a listing.
Toolkit and LMS integration
Call the same pure Morbit module from grading scripts or multi-cipher APIs so browser demos and server checks never diverge.
FAQ
What is the Morbit cipher?
A fractionated Morse cipher: convert text to Morse with / between letters and // between words, pair symbols into nine digrams, and replace each digram with a unique digit 1–9 from your key.
What key formats are accepted?
Either a 9-digit permutation of 1–9 (each digit once, no zero), or a 9-letter A–Z keyword whose alphabetical ranks produce that numeric index (ties broken left to right).
How do I encrypt MORE BITS with key 568931724?
Send text "MORE BITS", key "568931724" (or keyword MORSECODE), mode encrypt. The result is the digit string 32379749578158. Decrypt with the same key recovers MORE BITS.
What are the nine pairs that Morbit replaces?
After the text is written in Morse, with a slash after each letter and a double slash between words, only dots, dashes and slashes remain. Read two at a time, they form nine pairs, from dot-dot to slash-slash, and the key gives each pair its own digit.
Why is the digit zero rejected when decrypting?
Because classical Morbit only uses the digits 1 to 9, one for each pair, so a zero can never be part of a real ciphertext. Digits that expand into Morse codes no letter uses are refused as well, instead of turning into garbage letters.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/enc/morbit \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"MORE BITS","key":"568931724"}'const res = await fetch("https://api.kit.forhosting.com/enc/morbit", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "MORE BITS",
"key": "568931724"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/morbit",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "MORE BITS",
"key": "568931724"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/morbit", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"MORE BITS","key":"568931724"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"MORE BITS","key":"568931724"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/morbit", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "MORE BITS",
"key": "568931724"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.morbit",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Bad keys, empty text, and ciphertext that does not expand to valid Morse fail with invalid_input and are not billed.
How Morbit pairs Morse symbols into digits
Classic teaching examples use a nine-letter keyword such as MORSECODE: sorting its letters alphabetically assigns ranks one through nine left to right on ties, producing the numeric index five six eight nine three one seven two four, which is exactly the nine-digit key you can paste into the API.
Input contract, modes, and error behaviour
POST a JSON body with required text and key, plus optional mode. Mode defaults to encrypt and also accepts decrypt, with short aliases enc, encode, e and dec, decode, d. Empty key, wrong length, repeated digits, mixed letter-digit strings, and empty plaintext all fail with invalid_input naming the problem.
Integration use cases
Codebusters and cryptogram practice
Encrypt sample phrases with a known 9-digit key or keyword, then let students recover plaintext and compare against the deterministic API result.
Technical questions
What inputs cause invalid_input?
Empty text or key, keys that are not a 1–9 permutation or 9-letter keyword, decrypt text containing 0 or non-digits, and ciphertext that does not expand to valid Morse under the key. Those failures are not billed.
What does the Morbit cipher tool cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.