모스 부호에는 왜 간격이 필요한가
"...."는 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(..)의 접두사이고, I가 S(...)의 접두사입니다.
허프만 부호는 접두사 부호로 만들어집니다. 그래서 비트를 이어 붙이기만 해도 한 가지로만 읽힙니다. 모스는 그렇지 않습니다.
그래서 간격이 부호의 일부다
모스의 타이밍 규격은 이렇습니다.
점 1단위
선 3단위
부호 사이 1단위
글자 사이 3단위
낱말 사이 7단위
글자 사이의 3단위 침묵이 경계입니다. 이것 없이는 H와 EEEE를 구분할 수 없습니다.
즉 모스는 점·선 두 가지가 아니라 점·선·짧은 침묵·중간 침묵·긴 침묵의 다섯 가지 기호로 된 부호입니다. 텍스트로 옮길 때 공백과 슬래시로 적는 것이 그 침묵입니다.
"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칸 옮겨 갑니다. 영문에서 가장 흔한 e가 r이 되고, 빈도 순위는 유지됩니다.
빈도 분석 한 번이면 시프트 값이 나옵니다. 26가지밖에 없으니 전부 시도해도 됩니다. ROT13은 암호가 아니라 글자를 눈에 안 띄게 하는 장치입니다 — 스포일러를 가리거나 답을 뒤집어 두는 용도로 만들어졌고, 그 용도에는 맞습니다.
부호화와 암호의 자리
| 하는 일 | 되돌리려면 | |
|---|---|---|
| 모스 | 텍스트를 소리·빛으로 | 부호표 |
| ROT13 | 글자를 옮김 | 아무것도 필요 없음 |
| Base64 | 바이트를 ASCII로 | 알고리즘만 |
| AES | 내용을 감춤 | 키 |
앞의 셋은 비밀이 없습니다. 누구나 되돌립니다. 이것을 "약한 암호"라고 부르면 안 됩니다 — 애초에 암호가 아닙니다.
확인 순서
- 모스를 텍스트로 저장한다면 글자 사이 공백과 낱말 사이 구분자를 함께 정합니다. 점·선만으로는 복원되지 않습니다
- 모스 파서를 만든다면 빈 문자열과 미정의 부호를 어떻게 처리할지 정합니다
- ROT13으로 무언가를 가리고 있다면 그것이 보안 요구사항인지 표시 요구사항인지 구분합니다
- 시프트 값이 13이 아니면 암호화와 복호화가 다른 연산입니다
- 비밀이 필요하면 키가 있는 알고리즘을 씁니다
tools.onuel.dev의 모스 부호 변환기는 숫자와 문장 부호를 포함해 양방향으로 변환합니다. ROT13은 시프트 값을 바꿀 수 있고, 13일 때만 한 버튼으로 양쪽이 처리됩니다. 바이트를 텍스트로 옮기는 쪽은 Base64와 Base32이고, 실제로 내용을 감추려면 AES입니다.
- #부호화
- #모스
- #ROT13