Cyrillic Atbash cipher
Mirror every Russian Cyrillic letter across the 33-letter alphabet, so А swaps with Я and ПРИВЕТ becomes ПОЦЭЪМ; running it again restores the original. Latin letters, digits and punctuation pass through and are counted. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Text
- ПРИВЕТ
- Result
- ПОЦЭЪМ
- Length
- 6
- Letters mirrored
- 6
- Non cyrillic
- 0
Cyrillic Atbash is the classical alphabet-mirror substitution applied to the Russian Cyrillic script: each of the thirty-three letters is reflected by position so the first maps to the last, the second to the second-last, and so on through Я back to А, while Latin letters, digits, spaces, and punctuation stay put and are reported as non-Cyrillic. Because the mapping is its own inverse, applying the same transform twice restores the original Russian letters, so one deterministic operation both encodes and decodes. People use Cyrillic Atbash for Russian puzzle books, classroom monoalphabetic demos, biblical-cipher comparisons across scripts, and light spoiler obfuscation without installing crypto libraries.
Encode, decode, validation rules, and common pitfalls
There is no separate encode or decode mode: the same request shape performs both directions. Paste plaintext Russian puzzle answers to hide them, or paste already-mirrored Cyrillic text to reveal them. Mixed-case Russian phrases preserve case because upper and lower alphabets reflect independently.
Ukrainian letters such as і or ґ are outside the Russian thirty-three-letter table used for this classical demo and likewise pass through, which keeps the algorithm faithful to Russian classroom Atbash rather than inventing a pan-Cyrillic table people do not search for. Do not treat the result as encryption: anyone who knows the scheme can reverse it instantly, and the product page should never market Cyrillic Atbash as a security control for secrets, passwords, or personal data.
Prefer this landing when the search intent is literally cyrillic atbash cipher or Russian Atbash encoder; the Latin atbash cipher, ROT13, general Caesar shift calculators, and Base64 or hex encoders answer different intents and should stay separate tools.
What you can do with it
Russian puzzle and riddle obfuscation
Hide Russian riddle answers, scavenger-hunt clues, and Easter eggs in Cyrillic Atbash so readers can opt in, then reverse the same string with one more call.
FAQ
How do I decode Cyrillic Atbash?
Use the same request. Cyrillic Atbash is its own inverse: paste the mirrored text into text and the result is the original Russian-letter content.
Is the Cyrillic Atbash cipher tool free?
The browser tool runs free on your device.
Why does the letter П stay the same?
Because the Russian alphabet used here has 33 letters, an odd number, so П sits exactly in the middle and mirrors onto itself. That is why ПРИВЕТ becomes ПОЦЭЪМ with its first letter unchanged.
Are Ukrainian letters such as і or ґ mirrored?
No. They are outside the Russian 33-letter table this classical version uses, so they pass through unchanged, like Latin letters, digits and punctuation. Every character that is not mirrored is counted, which makes mixed text easy to check.
Is Cyrillic Atbash safe for hiding secrets?
No. Anyone who knows the scheme can reverse it instantly, so it should never protect passwords or personal data. Use it for Russian puzzles, classroom demonstrations and spoilers that readers can choose to reveal.
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/atbash-cyrillic \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"ПРИВЕТ"}'const res = await fetch("https://api.kit.forhosting.com/enc/atbash-cyrillic", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "ПРИВЕТ"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/atbash-cyrillic",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "ПРИВЕТ"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/atbash-cyrillic", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"ПРИВЕТ"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"ПРИВЕТ"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/atbash-cyrillic", 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": "ПРИВЕТ"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.atbash_cyrillic",
"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
This capability takes a non-empty text field, returns the transformed string with counts of mirrored Cyrillic letters and pass-through non-Cyrillic characters, and rejects empty input with a clear invalid_input error.
How Cyrillic Atbash works and what the response contains
Cyrillic Atbash mirrors each Russian letter by its index in the thirty-three-letter alphabet that places Ё after Е: uppercase А through Я maps to Я through А, and lowercase а through я follows the same reflection within the lower alphabet so case is preserved. The midpoint letter П maps to itself because the alphabet length is odd. Characters outside that Russian set—Latin A–Z, digits, punctuation, whitespace, emoji, and Ukrainian or other non-Russian Cyrillic letters—pass through unchanged so mixed messages keep their shape and spacing, while the response field non_cyrillic counts every code unit that was not mirrored. Send a JSON body with the required string field text set to any non-empty message; aliases input, value, and s are accepted when clients reuse older form names. Empty strings fail immediately with invalid_input because there is nothing meaningful to transform and the product promise is a real substitution result. On success the response includes result with the transformed text, method equal to atbash_cyrillic so downstream code can branch without sniffing shapes, length equal to the input character count, letters_mirrored counting how many Russian А–Я or а–я including Ё/ё units actually flipped, and non_cyrillic counting every other character. Identical inputs always produce identical JSON because the path is pure character arithmetic with no network, no random seed, and no wall clock. Use letters_mirrored and non_cyrillic together when you want to assert that mixed Latin-plus-Cyrillic strings still processed correctly without inventing a second mode field.
Encode, decode, validation rules, and common pitfalls
Missing text, non-string text, or an empty string all raise invalid_input and are not charged on the prepaid API. Whitespace-only strings that still have length greater than zero are accepted; only Russian Cyrillic letters mirror, so a string of spaces returns itself with letters_mirrored equal to zero and non_cyrillic equal to the length. Latin Atbash is a different product with a different SEO intent: do not expect English words inside text to flip A to Z here; they pass through and increase non_cyrillic.
API usage, pricing, classroom workflows, and practical limits
Call the free in-browser Cyrillic Atbash cipher for Russian puzzle drafting, Slavic-script monoalphabetic demos, lecture slides, and one-off checks without writing a one-liner in every language. Support playbooks can reverse lightly obfuscated ticket notes that staff intentionally wrote in Cyrillic Atbash. Pair with Latin Atbash or Base64 tools only when a later step needs a different alphabet—keep Cyrillic Atbash on its own landing so SEO intent stays sharp and does not cannibalize the English atbash cipher page. Use the prepaid KIT API when a backend, serverless function, tutoring platform, or SDK needs a stable contract under balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. A typical classroom workflow shows students that mirroring the Russian alphabet twice returns the original message, then contrasts that involution with a true keyed monoalphabetic cipher later in the syllabus, and uses non_cyrillic to discuss what happens when Latin brand names sit inside Russian copy. Puzzle sites can precompute Russian answers for display and reveal them on demand with the same endpoint. Authors shipping SDKs can map the result field straight into a copy button while method, letters_mirrored, and non_cyrillic make OpenAPI examples self-explanatory. Keep payloads to ordinary text sizes appropriate for a Worker isolate item call; this tool is for messages and snippets, not multi-megabyte binary blobs.
Integration use cases
Classroom monoalphabetic demos
Teachers show that Russian alphabet mirroring is an involution: encode, decode, and compare letters_mirrored and non_cyrillic without installing a crypto library.
Pipeline and CI fixtures
Scripts and continuous-integration tests pin deterministic Cyrillic Atbash outputs so accidental alphabet, case, or Ё-handling changes fail fast.
Technical questions
How do I encode text with the Cyrillic Atbash cipher?
Send JSON with a non-empty text field (for example text: "ПРИВЕТ"). The response result field holds the mirrored string; method is always atbash_cyrillic.
What happens if text is empty?
The request fails with invalid_input. A non-empty string is required; empty input is not charged on the prepaid API.
What about Latin letters or other non-Cyrillic characters?
They pass through unchanged. The non_cyrillic field counts how many characters were not Russian А–Я / а–я (including Ё/ё).