← Back to Writeups
CUSTOMEasyCrypto

Запутанный шифр (Confused Cipher)

XESXOR9/10/20264 min read
#crypto#custom#easy#fruit_delimiter_pattern#morse_code_decoding

Запутанный шифр (Confused Cipher)

Platform: hackerlab | Category: Crypto | Type: Challenge | Difficulty: Easy | OS: NA | Author: XESXOR | Date: 2025-12-25 | Status: Solved Techniques: fruit_delimiter_pattern, morse_code_decoding

Summary

Task: Decode a string with Cyrillic fruit names and Morse-like symbols. Solution: Recognize fruit names as delimiters and decode the Morse code between them to reveal the flag.

Запутанный шифр (Confused Cipher) — hackerlab

Description

Вроде что-то знакомое...Или нет? (Something familiar... Or not?)

A text file with a strange string containing fruit names in Russian and dot/dash symbols was provided.

Analysis

Original text:

яблоко-.-. банан--- апельсин-.. виноград. ананас-... яблоко-.-- банан{ апельсин-.. виноград.---- ананас-.. яблоко..--.- банан-.-- апельсин----- виноград..- ананас..--.- яблоко.-. банан...-- апельсин-.-. виноград----- ананас--. яблоко-. банан.---- апельсин--.. виноград...-- ананас..--.- яблоко-- банан----- апельсин.-. виноград... ананас...-- яблоко..--.- банан-.-. апельсин----- виноград-.. ананас...-- яблоко..--.. банан}

‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Observations

  1. Cyclic fruit pattern: Fruit names repeat in strict order:

    • яблоко → банан → апельсин → виноград → ананас → яблоко → ...
  2. Morse-like symbols: After each fruit name there are . and - symbols — this is Morse code!

  3. Special characters: { and } are inserted as-is (part of the flag format).

Structure

Fruits serve as delimiters between Morse codes. This is obfuscation — a distraction to hide the obvious Morse.

Solution

python
#!/usr/bin/env python3
import re
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

morse_code = {
    '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F',
    '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L',
    '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R',
    '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X',
    '-.--': 'Y', '--..': 'Z', '-----': '0', '.----': '1', '..---': '2',
    '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7',
    '---..': '8', '----.': '9', '..--.-': '_', '..--..': '?'
}
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

text = "яблоко-.-. банан--- апельсин-.. виноград. ананас-... яблоко-.-- банан{ апельсин-.. виноград.---- ананас-.. яблоко..--.- банан-.-- апельсин----- виноград..- ананас..--.- яблоко.-. банан...-- апельсин-.-. виноград----- ананас--. яблоко-. банан.---- апельсин--.. виноград...-- ананас..--.- яблоко-- банан----- апельсин.-. виноград... ананас...-- яблоко..--.- банан-.-. апельсин----- виноград-.. ананас...-- яблоко..--.. банан}"

# Remove fruit names (Cyrillic), keep only Morse and brackets
parts = re.split(r'[а-яё]+', text)
parts = [p.strip() for p in parts if p.strip()]
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

flag = ""
for p in parts:
    if p in '{}'':
        flag += p
    else:
        flag += morse_code.get(p, p)

print(flag)

Step-by-step decoding

FruitMorseSymbol
яблоко-.-. C
банан---O
апельсин-..D
виноград.E
ананас-...B
яблоко-.--Y
банан{{
апельсин-..D
виноград.----1
ананас-..D
яблоко..--.-_
банан-.--Y
апельсин-----0
виноград..-U
ананас..--.-_
яблоко.-.R
банан...--3
апельсин-.-.C
виноград-----0
ананас--.G
яблоко-.N
банан.----1
апельсин--..Z
виноград...--3
ананас..--.-_
яблоко--M
банан-----0
апельсин.-.R
виноград...S
ананас...--3
яблоко..--.-_
банан-.-.C
апельсин-----0
виноград-..D
ананас...--3
яблоко..--..?
банан}}
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Morse Code Reference

Letters

A: .-     B: -...   C: -.-.   D: -..    E: .
F: ..-.   G: --.    H: ....   I: ..     J: .---
K: -.-    L: .-..   M: --     N: -.     O: ---
P: .--.   Q: --.-   R: .-.    S: ...    T: -
U: ..-    V: ...-   W: .--    X: -..-   Y: -.--
Z: --..

Digits

0: -----  1: .----  2: ..---  3: ...--  4: ....-
5: .....  6: -....  7: --...  8: ---..  9: ----.

Special characters

_: ..--.-  (underscore)
?: ..--..  (question mark)

‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍