개발 이야기3분 읽기

모스 부호에는 왜 간격이 필요한가

"...."는 H인가 EEEE인가. 부호가 스스로 경계를 갖지 못할 때 무엇이 필요한지 정리했습니다.

모스 부호에서 H....이고 E.입니다. 그러면 ....은 무엇입니까.

여덟 가지로 읽힌다

....을 모스 부호표로 가를 수 있는 모든 방법을 세어 봤습니다.

"...."  → 8가지: EEEE, EEI, EIE, ES, H, IEE, II, SE
".-"    → 2가지: A, ET
"-..."  → 8가지: B, DE, NEE, NI, TEEE, TEI, TIE, TS

점과 선만 이어 놓으면 경계를 복원할 수 없습니다. 어떤 부호도 다른 부호의 접두사가 되지 않는 부호를 접두사 부호라고 하는데, 모스는 접두사 부호가 아닙니다. E(.)I(..)의 접두사이고, IS(...)의 접두사입니다.

허프만 부호는 접두사 부호로 만들어집니다. 그래서 비트를 이어 붙이기만 해도 한 가지로만 읽힙니다. 모스는 그렇지 않습니다.

그래서 간격이 부호의 일부다

모스의 타이밍 규격은 이렇습니다.

점         1단위
선         3단위
부호 사이  1단위
글자 사이  3단위
낱말 사이  7단위

글자 사이의 3단위 침묵이 경계입니다. 이것 없이는 HEEEE를 구분할 수 없습니다.

즉 모스는 점·선 두 가지가 아니라 점·선·짧은 침묵·중간 침묵·긴 침묵의 다섯 가지 기호로 된 부호입니다. 텍스트로 옮길 때 공백과 슬래시로 적는 것이 그 침묵입니다.

"SOS"          → ... --- ...            27단위
"HELLO WORLD"  → .... . .-.. .-.. --- / .-- --- .-. .-.. -..   111단위
"E"            → .                      1단위
"O"            → ---                    11단위

E 하나와 O 하나가 11배 차이입니다.

길이는 빈도를 따라간다

1부호: E T
2부호: A I M N
3부호: D G K O R S U W
4부호: B C F H J L P Q V X Y Z

가장 흔한 글자에 가장 짧은 부호를 준 설계입니다. 1844년에 만들어진 것이고, 허프만이 같은 원리를 형식화한 것은 1952년입니다.

영어 기준으로 정한 빈도라서 다른 언어에서는 효율이 떨어집니다. E가 흔하지 않은 언어에서는 부호가 길어집니다.

ROT13은 두 번 돌리면 제자리

원문      Attack at dawn
ROT13     Nggnpx ng qnja
한 번 더  Attack at dawn

알파벳이 26자이고 13이 그 절반이라, 13칸 두 번이 26칸 곧 제자리입니다. 그래서 암호화와 복호화가 같은 연산입니다.

다른 값은 그렇지 않습니다. ROT5를 두 번 걸면 ROT10이 됩니다.

ROT13이 숨기지 못하는 것

원문 상위 3글자  : e(5) o(4) t(3)
ROT13 상위 3글자 : r(5) b(4) g(3)

글자 빈도 분포가 그대로 13칸 옮겨 갑니다. 영문에서 가장 흔한 er이 되고, 빈도 순위는 유지됩니다.

빈도 분석 한 번이면 시프트 값이 나옵니다. 26가지밖에 없으니 전부 시도해도 됩니다. ROT13은 암호가 아니라 글자를 눈에 안 띄게 하는 장치입니다 — 스포일러를 가리거나 답을 뒤집어 두는 용도로 만들어졌고, 그 용도에는 맞습니다.

부호화와 암호의 자리

하는 일 되돌리려면
모스 텍스트를 소리·빛으로 부호표
ROT13 글자를 옮김 아무것도 필요 없음
Base64 바이트를 ASCII로 알고리즘만
AES 내용을 감춤

앞의 셋은 비밀이 없습니다. 누구나 되돌립니다. 이것을 "약한 암호"라고 부르면 안 됩니다 — 애초에 암호가 아닙니다.

확인 순서

  1. 모스를 텍스트로 저장한다면 글자 사이 공백과 낱말 사이 구분자를 함께 정합니다. 점·선만으로는 복원되지 않습니다
  2. 모스 파서를 만든다면 빈 문자열과 미정의 부호를 어떻게 처리할지 정합니다
  3. ROT13으로 무언가를 가리고 있다면 그것이 보안 요구사항인지 표시 요구사항인지 구분합니다
  4. 시프트 값이 13이 아니면 암호화와 복호화가 다른 연산입니다
  5. 비밀이 필요하면 키가 있는 알고리즘을 씁니다

tools.onuel.dev모스 부호 변환기는 숫자와 문장 부호를 포함해 양방향으로 변환합니다. ROT13은 시프트 값을 바꿀 수 있고, 13일 때만 한 버튼으로 양쪽이 처리됩니다. 바이트를 텍스트로 옮기는 쪽은 Base64Base32이고, 실제로 내용을 감추려면 AES입니다.

  • #부호화
  • #모스
  • #ROT13