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(;8896?;8)‡(;485);5

2:‡(;49562(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))6THE26)H‡.)H‡)TE06THE†E¶60))E5T1‡(T:‡E†E3(EE)5†TH6(TEE96?TE)‡(THE5)T5†2:‡(TH9562(5-H)E¶ETH0692E5)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))6THE26)HO.)HO)TE06THE†E¶60))E5T1ORT:OE†EGREE)5†TH6RTEE96UTE)ORTHE5)T5†2:ORTH9562R5-H)E¶ETH0692E5)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')

str2 = str2.replace('5','A')

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”

Um comentário sobre “Escaravelho Dourado: decifre o enigma de Allan Poe com Python

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s