Escaravelho Dourado: decifre o enigma de Allan Poe com Python

“O Escaravelho Dourado” é um pequeno conto, do escritor americano Edgar Allan Poe, publicado em 1843.

O enredo narra a história de William Legrand, supostamente picado por um escaravelho dourado. Seu servo Júpiter teme que Legrand fique louco, e com a ajuda do narrador anônimo, partem para uma aventura que envolve uma mensagem criptografada e um tesouro escondido.

Sem mais delongas, os aventureiros se depararam com a seguinte mensagem.

53‡‡†305))6*;4826)4‡.)4‡);80
6*;48†8¶60))85;1‡(;:‡*8†83(88)
5*†;46(;88*96*?;8)*‡(;485);5*†
2:*‡(;4956*2(5*-4)8¶8*;40692
85);)6†8)4‡‡;1(‡9;48081;8:8‡1
;48†85;4)485†528806*81(‡9;48
;(88;4(‡?34;48)4‡;161;:188;‡?;

A primeira informação é que a mensagem está em inglês. O narrador cita que, tendo decifrado inúmeras mensagens criptogradas, é essencial saber qual a linguagem em que este está escrito.

A seguir, ele faz uma contagem dos caracteres existentes.

Em Python, podemos utilizar um set para listar os caracteres únicos, como mostra o código a seguir.

strOriginal = "53‡‡†305))6;4826)4‡.)4‡);806;48†8¶60))85;1‡(;:‡8†83(88)5†;46(;8896?;8)‡(;485);5†2:‡(;49562(5-4)8¶8;4069285);)6†8)4‡‡;1(‡9;48081;8:8‡1;48†85;4)485†528806*81(‡9;48;(88;4(‡?34;48)4‡;161;:188;‡?;" caracteres = set(strOriginal)

A seguir, podemos contar o número de vezes que cada caractere aparece na string, e imprimir o resultado:

dictCaract ={} for ch in caracteres:
dictCaract[ch] = strOriginal.count(ch)
for i in sorted(dictCaract, key = dictCaract.get, reverse=True):
print(i, dictCaract[i])

Resultado:
8 33
; 26
4 19
‡ 16
) 16
* 13
5 12
6 11
( 10
1 8
† 8
0 6
2 5
9 5
: 4
3 4
? 3
¶ 2
. 1
- 1

O caractere ‘8’ aparece 33 vezes, seguido pelo caractere ‘;’, 26 vezes. Em inglês, “e” é a letra mais comum, então um bom chute é considerar ‘8’ -> ‘E’. Vou utilizar maiúsculas para indicar a string trocada.

A seguir, o narrador nota que a cadeia de strings ‘;48’ aparece com grande frequência no texto, e o último caractere é “E”.

O ‘THE’ é um artigo bastante comum na língua inglesa, de modo que as substituições ‘;’ -> ‘T’, ‘4’ -> ‘H’ parecem ser um bom chute.

Em Python, é só usar a função replace:

str2 = strOriginal.replace('8','E')
str2 = str2.replace(';','T')
str2 = str2.replace('4','H')

Resulta em:

53‡‡†305))6 THE26)H‡.)H‡)TE06THE†E¶60))E5T1‡(T:‡ E†E3(EE)5†TH6(TEE 96?TE) ‡(THE5)T5†2: ‡(TH9562(5-H)E¶E TH0692E5)T)6†E)H‡‡T1(‡9THE0E1TE:E‡1THE†E5TH)HE5†52EE06*E1(‡9THET(EETH(‡?3HTHE)H‡T161T:1EET‡?T

Ainda bastante ininteligível, porém, um pouco mais familiar.

Pescando algumas palavras, há um trecho assim: ‘t(ee’, que pode ser ‘tree’, indicando a substituição ‘(‘ -> ‘R’.

O trecho fica:
the tree thr‡?3h the.

A palavra ‘through’ indica novas letras ‘O’, ‘U’ e ‘G’, representadas por ‘‡’, ‘?’ e ‘3’.

No Python, letra por letra (é possível por outros meios em massa, mas assim é mais didático).

str2 = str2.replace('(','R') str2 = str2.replace('‡','O')
str2 = str2.replace('?','U')
str2 = str2.replace('3','G')

Resultando em:

5GOO†G05))6 THE26)HO.)HO)TE06THE†E¶60))E5T1ORT:O E†EGREE)5†TH6RTEE 96UTE) ORTHE5)T5†2: ORTH9562R5-H)E¶E TH0692E5)T)6†E)HOOT1RO9THE0E1TE:EO1THE†E5TH)HE5†52EE06*E1RO9THETREETHROUGHTHE)HOT161T:1EETOUT

Outras pistas:
†83(88, ou †egree,

Deixando clara a palavra ‘degree’, e a substituição ‘†’ por ‘D’.

Outro trecho parcialmente traduzido fica “TH6RTEE ‘, evidentemente ‘thirteen’, ‘6’ -> ‘I’ e ‘ ‘ -> ‘N’.

O início, ‘5GOOD’, indica o ‘5’ como ‘A’.

Colocando todas as pistas no Python, temos:

str2 = str2.replace('†','D')
str2 = str2.replace('6','I')
str2 = str2.replace('*','N')

Texto parcialmente decifrado:

AGOODG0A))INTHE2I)HO.)HO)TE0INTHEDE¶I0))EAT1ORT:ONEDEGREE)ANDTHIRTEEN9INUTE)NORTHEA)TAND2:NORTH9AIN2RAN-H)E¶ENTH0I92EA)T)IDE)HOOT1RO9THE0E1TE:EO1THEDEATH)HEADA2EE0INE1RO9THETREETHROUGHTHE)HOT1I1T:1EETOUT

Allan Poe para por aí, dizendo que o resto segue a mesma lógica, e realmente não é difícil. Por exemplo, ‘9INUTE)’ significa ‘MINUTES’; pelo contexto de direção, ‘NORTHEA)T’ significa ‘NORTHEAST’ e assim por diante.

Fechando a cifra:

str2 = str2.replace('0','L')
str2 = str2.replace(')','S')
str2 = str2.replace('2','B')
str2 = str2.replace('.','P')
str2 = str2.replace('¶','V')
str2 = str2.replace('1','F')
str2 = str2.replace(':','Y')
str2 = str2.replace('9','M')
str2 = str2.replace('-','C')

Resulta em:

AGOODGLASSINTHEBISHOPSHOSTELINTHEDEVILSSEATFORTYONEDEGREESANDTHIRTEENMINUTESNORTHEASTANDBYNORTHMAINBRANCHSEVENTHLIMBEASTSIDESHOOTFROMTHELEFTEYEOFTHEDEATHSHEADABEELINEFROMTHETREETHROUGHTHESHOTFIFTYFEETOUT

Como está sem pontuação e espaço, estes devem ser inseridos:

“A good glass in the Bishop’s hostel in the Devil’s seat — forty-one degrees and thirteen minutes — northeast and by north — main branch seventh limb east side — shoot from the left eye of the death’s-head — a bee-line from the tree through the shot fifty feet out.’”

[Um bom vidro no hotel do bispo na cadeira do diabo — quarenta e um graus e treze
minutos nordeste quadrante norte — tronco principal sétimo galho lado leste — atirai do
olho esquerdo da caveira — uma linha de abelha da árvore através o tiro cinqüenta pés
distante.]

Esta é uma cifra de substituição simples, onde cada palavra é trocada por um caracter específico. Sabendo o dicionário, é possível cifrar e decifrar uma mensagem. Cifras deste tipo são conhecidas desde o Império Romano, e são muito frágeis, bastando um ataque de contagem e força bruta, como demonstrados no conto. Atualmente, há métodos de chave assimétrica como o RSA, extremamente mais avançados. Porém, na época de Allan Poe, este era o melhor que existia, e o conto do “Escaravelho dourado” ajudou a popularizar a ciência da criptografia.

Vide o código completo no Colab: https://colab.research.google.com/drive/1l1MztHdxUHdJl1yW4NZzn1heDUvoSoJJ?usp=sharing

Visite o meu blog pessoal https://ideiasesquecidas.com/

Conto ‘Golden Bug’, de Edgar Allan Poe https://poestories.com/read/goldbug

Conto em português, “O Escaravelho Dourado” https://perguntasaopo.files.wordpress.com/2012/02/edgar-allan-poe-o-escaravelho-de-ouro.pdf

Originally published at https://ideiasesquecidas.com on October 12, 2021.

Project Manager on Analytics and Innovation. “Samurai of Analytics”. Passionate about Combinatorial Optimization, Philosophy and Quantum Computing.