한국어 번역 · 원저 Daniel Bourdeau, 《Unsolved Historical Ciphers》는 CC BY 4.0으로 공개되었다. 이 페이지는 JIC가 번역했으며 원저자의 공식 판본이 아니다. 번역과 원문이 다를 경우 영어 원문이 우선한다 · 영어 원문 보기 ↗

코펜하겐 · 획, 점, 숫자, 체계 미확정 · 아마도 1950년대 후반에 발견

코펜하겐 암호문

코펜하겐의 한 군사 박물관에 있던 덴마크 장군의 1835년 초상화 뒤에서 발견된, 획·점·꺾쇠·숫자로 이루어진 세 줄. Klaus Schmeh의 Top 50 중 23번이다. 2026년 9월, 두 가지 전사와 여섯 가지 규약 아래 열 개 언어의 단순 치환으로 공략했으며, 조건을 맞춘 대조 실험도 함께 했다. 키는 복원되지 않았고, 발표된 해독도 없다.

Daniel Bourdeau · 게시 · 갱신 · 출처: Klaus Schmeh의 Cipherbrain 게시물(2015년 1월, 2017년 8월, 2021년 10월)과 그 댓글, 614 × 147 px 스캔본 Danish-General-Cryptogram.jpg

방법: 미해독 · 범위: 텍스트를 얻지 못함

시험한 어떤 언어의 단순 치환도 아니다 스캔본 기준으로 종결

유통 중인 두 전사 모두를 5-gram 언어 모델로 점수를 매기는 솔버(담금질 기법)로 열 개 언어에 걸쳐 공략했다. 어느 언어든 최고 점수는 글자당 −2.69 nat였고, 300회 재시작으로도 움직이지 않았다. 같은 솔버는 같은 방식으로 암호화한 무작위 103글자 구절 15개 중 12개를 복원하며, 이 길이의 실제 텍스트는 −1.4에서 −2.1 사이의 점수를 낸다. 이 쪽지가 이들 언어로 된 텍스트의 단순 치환이 아니거나, 두 판독이 같은 전사 오류를 공유하고 있거나 둘 중 하나다.

01 대상과 그 내력

쪽지에는 짧은 세 줄이 적혀 있다. 아마도 1950년대 후반, 코펜하겐의 한 군사 박물관에 있던 덴마크 장군의 1835년 초상화 뒤에서 발견되어 미국 암호 협회(American Cryptogram Association)로 보내졌다. ACA는 해답을 기록하지 않았고 보고서를 쓴 적도 없다. 박물관, 장군, 발견자 모두 기록되어 있지 않다.

Klaus Schmeh는 플로리다에 살던 스웨덴인으로 2016년에 사망한 ACA 회원 Kent Ramliden에게서 스캔본을 받았다. 그는 이를 세 번 발표했다. 2015년 1월에 독일어로, 2017년 8월에 Top 50의 23번으로, 2021년 10월에 독일어와 영어 “미제 사건” 게시물로. 유통되는 이미지는 614 × 147픽셀의 그 스캔본 하나뿐이다. 2021년 댓글 가운데 여기서 중요한 독자 기여는 두 가지다. “ShadowWolf”의 25기호 전사, 그리고 아무것도 찾지 못한 Matthew Brown의 덴마크어 4-gram 언덕 오르기다.

02 전사

두 가지 전사를 사용했다. cipher.txt 는 이 프로젝트의 것으로, 스캔본을 4배와 6배로 확대해 반 줄씩 만들었다. cipher_sw.txt 는 2021년 10월 7일 독일어 게시물 댓글에 실린 ShadowWolf의 25기호 판독이다. 다음은 통합 판독으로, 기호 하나당 토큰 하나, 공백으로 구분했다:

7 N F n F B 3 A D B n o 3 D B P 6 3 B 3 P 8 D F 2 n 3 | 2 3 A W R F 0 3
A n 2 0 B n o 9 P n P 9 2 B 3 v v 3 D B | 0 A B v 3 D B P n o F 3 8 0 D B
P X 0 3 B n o n F 9 n D B v n | 1 3 | n o n 3 F D B 3 F B A 1 2 3 A

모두 107토큰이다. 20종 103기호에, 긴 세로획 4개를 더한 것인데, 이 세로획은 | 로 적고 문장 구분자로 취급했다. 숫자 4와 5는 한 번도 나오지 않는다.

토큰쪽지 위의 표시횟수
3숫자 316
n보통의 n13
B뒤에 점이 붙은 역슬래시 (\.)14
F뒤에 점이 붙은 슬래시 (/.)8
P더하기 기호6
A꺾쇠 또는 람다 (^)6
D획 앞에 오는 독립된 점8
o작고 둥근 글자 o5
2숫자 25
0키 큰 05
v쓰인 그대로4
9숫자 93
1숫자 12
8숫자 82
7 6 X쓰인 그대로각 1
N위에 점 두 개가 있는 n1
R1행 끝의 작은 “or” 모양 글리프1
W위에 이중 악센트가 있는 꺾쇠1
|긴 세로획, 문장 구분자, 103개에 포함하지 않음4

두 판독이 다른 곳

두 판독은 기호 하나하나 일치하지만, 여기서 통합한 것을 ShadowWolf는 나눈다. 그는 뒤에 점이 붙은 역슬래시와 양쪽에 점이 있는 역슬래시를 구별하는데, 후자는 여기서는 독립된 점 D 다음에 B가 오는 것으로 본다. 그는 뒤에 점이 붙은 슬래시와 앞에 점이 붙은 슬래시를 구별하는데, 후자는 여기서는 D 다음에 F이다. 그는 첫 꺾쇠 쌍 뒤의 작게 올려 쓴 이중 체크 표시에 별도의 기호를 준다. 그는 꺾쇠 모양을 네 가지로 구별한다. 람다처럼 키 큰 것(1행의 첫 꺾쇠이자 3행의 마지막 기호), 작은 것, 2행을 여는 뒤에 점이 붙은 것, 2행의 0 뒤에 오는 것이다. 그리고 그는 3행의 1 3 주변에 있는 두 번째 키 큰 획을 구분자가 아니라 숫자 1로 읽는다. 이렇게 나누면 기호 수는 25로 Schmeh의 수치와 같고, 통합하면 20이다. 두 판독 모두 공략했다.

두 가지 내부 규칙성

편지 o 는 다섯 번 나오며 매번 바로 n: no3, no9, +no, non 및 non3뒤에 오고, non 는 3행에서 두 번 나온다. 겹친 쌍 vv 는 2행에서 한 번 나온다. 이것이 어디까지 이어지는지는 06절에서 보인다.

03 공략

solve.py 는 Project Gutenberg 텍스트로 열 개 언어의 문자 5-gram 언어 모델을 만든다. 덴마크어, 스웨덴어, 노르웨이어, 독일어, 네덜란드어, 프랑스어, 영어, 라틴어, 아이슬란드어, 핀란드어이며, 언어당 60만에서 240만 글자다. 말뭉치는 저장소에 없으며, 세션 로그에 있는 id로 Gutendex API를 통해 가져온다. 솔버는 기호에서 글자로의 단사 사상에 대한 담금질 기법으로, 실행당 60–80회 재시작하며 긴 획은 문장 경계로 취급한다. 솔버는 5-gram 점수만을 최적화하고, 상위 후보는 그 뒤 사전 적중률로 다시 순위를 매기는데, 솔버는 이 적중률을 최적화하지 않는다.

통합 판독에 대해 여섯 가지 토큰 규약을 시험했다. 독립된 점을 글자로 보기, 버리기, 경계로 보기, 뒤따르는 획에 합치기, 긴 획을 글자로 보기, 점 있는 n을 보통 n과 합치기다. 25기호 판독은 있는 그대로 실행했다. 별도의 스크립트 solve_sp.py는 점 있는 두 획이 단어 구분자라는 가설을 시험한다. 그렇다면 텍스트는 평균 3.7글자인 22단어가 되며, 공백을 인식하는 모델로 단어 전체 적중을 채점한다.

어떤 규약 아래서도 어떤 언어로도 읽을 수 있는 것은 나오지 않았다. 최고 글자당 점수와 최고 키가 만들어 낸 결과:

언어글자당 최고 점수, 모든 규약결과의 모습
라틴어−2.69fxsisted tine togeteom scie ...
덴마크어−2.77junindel dige dskedesf ... / ... udstødes ... velsigne ...
노르웨이어−2.81bærersag sena stjasatm ...
스웨덴어−2.81honensam sera stfasatv ...
우리말 풀이−2.88cydidsea sine stbesetf ...
독일어−2.93uchthien itze irbeierm ...
프랑스어−2.97chiailes lape ltbeletr ...
네덜란드어, 아이슬란드어, 핀란드어−3.07 ~ −3.30

단어 구분자 가설은 공백 모델에서 글자당 −4.6점인데, 실제 텍스트는 약 −2.3점이다. 이 가설은 고립된 덴마크어 단어 er, elle, unge, død, døde만 내놓는다. 마지막 둘이 06절에서 다루는 단편이다.

04 조건을 맞춘 대조 실험

실패한 탐색은 그 자체로는 아무것도 증명하지 않으므로, 솔버가 풀어야 할 텍스트로 솔버를 보정했다. control.py 는 같은 말뭉치에서 문장 구분 세 개가 있는 103글자 구절을 무작위로 뽑아, 각각을 약 20기호의 무작위 단순 치환으로 암호화하고, 동일한 솔버로 공략한다. 언어당 3회 시행, 각 40회 재시작이다. 실제 암호문에는 60–80회, 이어서 300회를 썼다. 정확도는 구절 중 복원된 비율이다.

언어시행키의 글자 수정확도찾은 점수참 텍스트의 점수결과
덴마크어1190.99−1.99−1.85복원됨
덴마크어2190.99−1.93−1.96복원됨
덴마크어3180.99−1.85−1.76복원됨
독일어1220.96−1.88−1.78복원됨
독일어2190.79−2.64−1.75부분
독일어3220.14−3.42−1.81탐색 실패
우리말 풀이1201.00−1.44−1.44복원됨
우리말 풀이2210.99−1.99−1.85복원됨
우리말 풀이3201.00−1.67−1.67복원됨
라틴어1181.00−2.09−2.09복원됨
라틴어2181.00−1.74−1.74복원됨
라틴어3190.99−1.87−1.72복원됨
스웨덴어1221.00−1.95−1.95복원됨
스웨덴어2220.05−3.49−1.59탐색 실패
스웨덴어3221.00−1.99−1.99복원됨

15개 구절 중 12개는 사실상 완전히 복원되며, 참 텍스트는 언제나 글자당 −1.4에서 −2.1 사이의 점수를 낸다. 두 시행은 완전히 실패하고 하나는 부분적으로 실패한다. 어느 경우든 참 키는 솔버가 찾은 것보다 훨씬 좋은 점수를 냈을 것이다. −1.81 대 −3.42, −1.59 대 −3.49, −1.75 대 −2.64. 이것들은 40회 재시작에서의 탐색 실패로, 22글자 키와 관련되었을 가능성이 가장 크며, 실제 텍스트에 대한 한 번의 실패한 실행은 아무것도 증명하지 못한다는 뜻이다. 그래서 가장 유력한 후보 언어들은 두 판독 모두에 대해 300회 재시작으로 다시 실행했다.

이 보정에 비추어 볼 때, 이 암호문은 어떤 언어로도, 어떤 판독으로도 −2.7보다 좋은 점수를 내지 못한다. 따라서 이것은 이 열 개 언어로 된 텍스트의 단순 치환이 아니거나, 전사가 독립된 두 판독이 공유하는 방식으로 글자를 합치거나 나누고 있거나 둘 중 하나다. 2015년 이래 기본 가정이었던 덴마크어는 라틴어나 노르웨이어보다 나을 것이 없다. 2021년 댓글에 실린 Matthew Brown의 덴마크어 4-gram 언덕 오르기도 똑같이 아무것도 얻지 못했다.

05 300회 재시작 확인

시드 5에서 300회 재시작했을 때의 글자당 최고 점수. 통합 판독은 다음 full 및 nodot 규약에서, 그리고 25기호 판독에 대해. dotattach 실행은 이 노트를 쓸 때 아직 진행 중이었고, 이 값을 넘지 못했다.

언어통합, 전체통합, 점 제외25기호 판독
라틴어−2.90−2.82−3.16
덴마크어−3.04−2.90−3.16
스웨덴어−3.17−2.99−3.20
노르웨이어−3.12−3.01−3.17
우리말 풀이−3.20−3.13−3.28
독일어−3.29−3.32−3.46

재시작을 다섯 배로 늘려도 아무것도 움직이지 않는다. 03절은 여섯 규약 중 최선을 택했고, 이 실행들은 규약과 시드를 고정했는데, 어느 칸도 그보다 나아지지 않는다. 상한은 같아서, 이 모든 언어에서 이 길이의 실제 텍스트가 내는 점수보다 글자당 0.7–1.4 nat 낮다. 탐색 실패라는 설명은 배제된다.

06 유일하게 시사적인 단편

non 를 død로

다음 대응에서 n = d, o = ø, 3 = e로 두면, n-o-n 패턴은 덴마크어 død(죽은, 죽음)가 되고, non3 는 døde(죽었다, 죽은 자들)가 되며, no3 는 dø(죽다)의 1900년 이전 철자인 døe가 된다. 전체 탐색에서 유일하게 시사적인 단편이다.

이것은 단어 구분자 실행에서 나왔는데, 그 실행의 다른 단어 전체 적중은 er, elle, unge뿐이었다. 관련된 세 기호가 103토큰 중 34개를 차지하므로, 이 대응은 텍스트의 3분의 1을 고정한다. 그러나 확장되지 않는다. 그 해독의 나머지는 잡음이며, 실행 전체는 글자당 −4.6점으로, 같은 모델에서 실제 텍스트는 약 −2.3점을 낸다.

07 현황과 재개 조건

미해독 현존하는 스캔본으로는 종결. 다시 열 수 있는 길은 세 가지다.

08 파일

모든 것은 프로젝트 저장소의 targets/copenhagen/ 에 있다. cipher.txt 는 헤더에 토큰 규약을 적은 통합 20기호 판독이고, cipher_sw.txt 는 그에 맞춰 정렬한 ShadowWolf의 25기호 판독이다. solve.py 는 사전 재순위 기능이 있는 5-gram 솔버(담금질 기법), solve_sp.py 는 단어 구분자 시험, control.py 는 대조 실험 장치다. NOTES.md 에는 시도의 전체 기록이 있다. Gutenberg 말뭉치는 저장소에 없으며, Gutendex id는 세션 로그에 있다.