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
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
Outras referências: https://ideiasesquecidas.com/laboratorio-de-matematica/