• Demonstrate a sufficient technology platform for upcoming experiments using Google Colab.
  • Show transparency and repeatability.
  • Provide a provisional proof of the project’s main premise.

Upcoming experiments will focus more on technology and less on background information.

with thanks to:

The primary goal of this project is to settle the controversy (which has been, improbably, raging for generations) about whether there are ‘Messages to the Future’ secretly embedded within the text of the First Folio of William Shakespeare.

There are. This project will provide visualizations which will demonstrate this, in a way which will be incontrovertible: that the First Folio is riddled with many diverse cipher systems, which have always been secretly lurking there since 1623 — though this is heatedly denied by some. The famous document where the secret messages have been concealed all along, was, already, the most-closely analyzed document in the history of the English Language. Yet somehow this slipped by almost completely.

This evidentiary foundation of this project consists of digital content generously provided to the public by the Bodleian Library of Oxford University, via the World Wide Web. Downloads are freely available of high resolution digital scans of their copy of the 1623 First Folio, one of the foundational documents of Anglo-American civilization.

A series of Experiments will be performed here, drawing from many online resources, but beginning with the Bodleian Library First Folio scans. Comprehensive transparency will be striven for, going forward, in order to encourage independent repetition of the experiments, and publication of results.

This strange excursion begins at a most unlikely place: the Shakespearean play, Troilus and Cressida, which is widely understood to be the least successful of the 36 plays of the First Folio. It is rarely, if ever, performed. It begins with an even more unlikable one-page ‘Prologue‘, making it only worse, a slice of nothing-pickle on top of a nothing-burger.

But we put forward the hypothesis here, that the Prologue can be understood to be the intended entranceway to a wondrous cryptographic labyrinth, one which has been hidden in plain sight for precisely 400 years.

You Are Here →

Troilus and Cressida is the only one of the 36 plays which doesn’t appear on the First Folios’s Catalogue page.

It doesn’t appear at all in the earlier press runs of the Folio. Evidence points to it being the very last of the plays included into the Folio. But why bother at all if it is so woefully lacking? Scholars seem baffled by it.

But the idea put forward here resolves the oddities:

It was always fully intended to be the worst of the 36 plays, with the Prologue being the most insufferable page of all.

The illustration below shows a digital reflection of the Bodleian Library Prologue page onto this website. It can be maximized and paged:

Please wait while flipbook is loading. For more related info, FAQs and issues please refer to DearFlip WordPress Flipbook Plugin Help documentation.

This Experiment is inextricably entangled with the brilliantly accomplished American cryptographer William F. Friedman (1891 – 1969).

Friedman was one of the founders of the US National Security Agency, and many recognize him as being the foremost Cryptographer of the 20th Century. He may have coined the term “Cryptanalysis”

As a person, Friedman was erratic, complex, and a dubious character.

In a booklet published in 1906, while he managed the Cryptography Department set up within Riverbank Laboratories of Illinois (the nation’s first privately-funded research institute) he seems to be saying that he devoted several man years to the study of secret codes within the First Folio.

Below is a page from his booklet, where he (or his workers) decoded the Prologue from Troilus and Cressida using the Biliteral Cipher of Sir Francis Bacon, which is first described as an appendix to Bacon’s classic, The Advancement of Learning (1623 edition). There, Bacon steps through the then-novel method of how to encode and decode hidden messages, providing several illustrations drawn by his own pen. Today we call it the Binary Code. It was the World’s first published description of the Binary Code.

The illustration below shows a digital reflection of the page from Friedman’s booklet. It can be maximized and paged:

Please wait while flipbook is loading. For more related info, FAQs and issues please refer to DearFlip WordPress Flipbook Plugin Help documentation.

The Keys for Deciphering the Greatest Work of Sir Francis Bacon

22 Pages, Riverbank Laboratories, Geneva, IL, 1906

On Page 9, above, Friedman steps through the method used to decode the hidden message embedded within The Prologue.

The purpose of our Experiment One is to re-create this method using modern technology, and demonstrate its validity.

Results appear to prove, at least indirectly, that Sir Francis Bacon (Francis St Albans) was, in fact, secretly one of the co-authors of the First Folio.

With each letter classified as to its a or b form, the procedure of deciphering was a simple step forward. Under each letter the original text was written the a or b designating the form to which it belonged, and the whole was then divided off into groups of five, each such group of a’s and b’s representing one letter as shown in Bacon’s cipher key (see page 4). Facing this page is a transcription of the u0022Prologueu0022 arranged in groups of five:beneath each letter is the a or b, to which form each letter belongs. Each such combination or group will be found to represent a corresponding letter in the cipher key. This is shown in order to enable the reader to follow the method of deciphering u002du002d-simple enough when the difficult preliminary step already described of assigning the letters to their respective class has been accomplished.
Wm F Friedman

Friedman’s description of the decoding method on Page 9 (copied left), is very terse, so it will be expanded upon below, with illustrations.

Friedman makes reference to Bacon’s cipher key, which encodes one letter of the alphabet (either upper or lower case) into a quintet of binary values, here, either an ‘a’ or ‘b’. This is equivalent to binary 1’s and 0’s.

A pair of Biformed Alphabets are also used, one each for upper and lower case. At left, the upper row of letters encode a printed letter with an ‘a’ form, while the bottom line encodes a letter into the ‘b’ form.

It can be seen that in some cases the difference between the two forms is easy to see (such as lower case ‘z’ here) but in other cases, (such as the letter ‘x’), the difference is miniscule. Readers don’t notice the two forms, however, so that blocks of text can contain roughly equal numbers of ‘a’ and ‘b’ forms; readers just pass off the lack of uniformity as Sloppy Typography.

Thus, hidden text can be concealed within a larger body of outer text.

At left is a sample of Page 7 of the booklet, showing how the original First Folio text has been divided into groups of five, with each letter (and this is the hard part) being already decoded as being ‘a’ or ‘b’. Beginning with Experiment Two, automating the onerous process of classifying a letter as the ‘a’ or ‘b’ form (using AI technology) will become the major focus of this project as a whole. But as Friedman notes in the last sentence of his description (on Page 8) his booklet illustrates the classification of the Biformed Values already completed. Therefore what comes next is relatively easy.

The following shows the above booklet illustration converted into a spreadsheet file:


The following is a simple program which reads the spreadsheet file and processes it to reveal the hidden message, exactly as documented in The Advancement of Learning. Details of the technical setup in use are given in the Colophon Page.

This kind of document (a Jupyter Notebook) shows both the source code of the program (using the Python computer language) and also the output results produced by the program.

Note that what Bacon called, “The Biliteral Cipher” is what we now call “The Binary Code”. And instead of illustrating with 1’s and 0’s (as we do currently), he used a’s and b’s.

Decoding the ‘Prologue to Troilus and Cressida’

In [50]:
notebook_filename = 'T & C Message Decode 1623_v33.ipynb' 
from google.colab import drive
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [51]:
import os
import csv
import pandas as pd
import shutil
import datetime
In [52]:
# Project Purpose:
# Decoding the message secretly embedded in the text of the Shakespearen play,
#'Trolious and Cressida'
# by Sir Francis Bacon, using his Biliteral Cipher (Binary Code) as described 
# in his 1623 book, The Advancement of Learning.
project_name = 'T & C Prologue Decode 1623'
# Derive input and output directories:
# Root Directory for project content on Google Drive:
content_dir = '/content/drive/MyDrive'
project_dir = content_dir + '/' + project_name 
data_upload_dir = project_dir + '/text data to upload - tsv/upload/'
In [53]:
#Input File path (1 total):
input_filename = 'v21.tsv'
data_upload_file = os.path.join(data_upload_dir, input_filename)
In [54]:
#Output File Directory paths (5 total):
original_text_dir = project_dir + '/original text - csv/' 
biliterals_dir = project_dir + '/biliterals - csv/' 
output_data_table_dir = project_dir + '/output data table - csv/' 
decoded_message_dir = project_dir + '/decoded message - csv/'
notebook_dir = project_dir + '/notebook - ipynb/'
archive_dir = project_dir + '/archive - zip/'
In [55]:
if os.path.isfile(data_upload_file):
if os.path.isdir(original_text_dir):
if os.path.isdir(biliterals_dir):
if os.path.isdir(output_data_table_dir):
if os.path.isdir(decoded_message_dir):
if os.path.isdir(notebook_dir):
if os.path.isdir(archive_dir):
/content/drive/MyDrive/T & C Prologue Decode 1623/text data to upload - tsv/upload/v21.tsv
/content/drive/MyDrive/T & C Prologue Decode 1623/original text - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/biliterals - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/output data table - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/decoded message - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/notebook - ipynb/
/content/drive/MyDrive/T & C Prologue Decode 1623/archive - zip/
In [56]:
import datetime
now = datetime.datetime.now()
output_filename = now.strftime("%Y-%m-%d_%H-%M-%S")
#print (output_filename)
In [57]:
# Decode a five bit binary word into an English Alphabet letter.
# There were 22 letters in the Elizabethan English Alphabet:
#   'I' = 'J'
#   'U' = 'V'
# therefore 5 binary digits are more than enough, 2 (exp) 5 = 32
def decode_biliteral(which):
  decode = {
  'aaaaa': 'a',
  'aaaab': 'b',
  'aaaba': 'c',
  'aaabb': 'd',
  'aabaa': 'e',
  'aabab': 'f',
  'aabba': 'g',
  'aabbb': 'h',
  'abaaa': 'i',
  'abaab': 'k',
  'ababa': 'l',
  'ababb': 'm',
  'abbaa': 'n',
  'abbab': 'o',
  'abbba': 'p',
  'abbbb': 'q',
  'baaaa': 'r',
  'baaab': 's',
  'baaba': 't',
  'baabb': 'v',
  'babaa': 'w',
  'babab': 'x',
  'babba': 'y',
  'babbb': 'z'
  which_letter = decode[which]
  return which_letter
In [58]:
# Read the input text data from the .tsv file:
input_data_table = pd.read_csv(data_upload_file, sep='t', header=None)
/content/drive/MyDrive/T & C Prologue Decode 1623/text data to upload - tsv/upload/v21.tsv
In [59]:
# De-interlace the original text from the book page text, and store it separately:
original_text = input_data_table.iloc[0::3, :]
ot_path = original_text_dir + output_filename + '.csv'
original_text.to_csv (ot_path, index = None, header=True) 
In [60]:
# De-interlace the biliterals (an 'a' or 'b' quintet) from the book page text, and store it separately:
biliterals = input_data_table.iloc[1::3, :]
blt_path = biliterals_dir + output_filename + '.csv'
biliterals.to_csv (blt_path, index = None, header=True) 
In [61]:
# Make a copy of the input data frame, and write rows of decoded biliterals into it:
output_encoded_dataframe = input_data_table.copy(deep=True)
encoded_text_size = 0
original_text_letters = ''
for row in range(2,45,3):
  for column in range(14):
    letter = output_encoded_dataframe.loc[row - 2,column] 
    biliteral = output_encoded_dataframe.loc[row - 1,column] 
    which_letter = decode_biliteral(biliteral)
    output_encoded_dataframe.loc[row,column] = which_letter
    encoded_text_size += 5
    original_text_letters += letter
odt_path = output_data_table_dir + output_filename + '.csv'
output_encoded_dataframe.to_csv (odt_path, index = None, header=True) 
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 ThePr olugu eINTr oyThe relye sthes ceneF romIl esofG reece ThePr inces Orgil loust
1 aabab baaaa aaaaa abbaa aaaba abaaa baaab baaab baaba aaaaa ababa aaaab aaaaa abbaa
2 f r a n c i s s t a l b a n
3 heirh ighbl oodch afdHa uetot hepor tofAt henss entth eirsh ippes Fraug htwit hthem
4 aaabb aabaa baaab aaaba aabaa abbaa aaabb aabaa aaabb aabab baaaa abbab ababb baaba
5 d e s c e n d e d f r o m t
6 inist ersan dinst rumen tsOfe ruell Warre Sixty andni netha twore Their Crown etsRe
7 aabbb aabaa ababb abaaa aabba aabbb baaba babba aabbb aabaa baaaa abbab aabaa baaab
8 h e m i g h t y h e r o e s
9 galif romth Athen ianba yPutf ortht oward Phyrg inand their vowis madeT orans ackeT
10 abbab aabab baaba baaaa abbab babba ababa abbab baabb abaaa abbaa aabba aaaaa abbaa
11 o f t r o y l o v i n g a n
12 roywi thinw hoses trong emure sTher auish dHele nmene lausQ ueene Withw anton Paris
13 aaabb baaaa aabaa baabb aabaa baaaa abaaa abbaa aabba baaba aabbb aabaa baaab aabaa
14 d r e v e r i n g t h e s e
15 sleep esand thats theQu arrel lToTe nedos theye omeAn dthed eeped rawin gBark edoth
16 abbaa abbab aaaab ababa aabaa aaaaa abbaa aaaba aabaa baaab baaba abbab baaaa baaab
17 n o b l e a n c e s t o r s
18 eredi sgorg eThei rwarl ikefr autag enowo nDard anPla inesT hefre shand yetva bruis
19 aabbb abaaa aaabb abaaa abbaa aabbb abaaa baaab babaa baaaa abaaa baaba abaaa abbaa
20 h i d i n h i s w r i t i n
21 edGre ekesd opite hThei rbrau ePaui llion sPria mssix gated CityD ardan AndTi mbria
22 aabba baaab aabbb abbab ababb aabaa baaaa baaab abaaa ababa ababa abaaa aaaaa aaabb
23 g s h o m e r s i l l i a d
24 Helia sChet asTro ienAn dAnte nonid nswit hmass ieSta plesA ndcor respo nsine andfu
25 baaab aaaaa abbaa aaabb abbab aaabb babba baaab baaab aabaa babba abaaa abbaa aaaba
26 s a n d o d y s s e y i n c
27 lfill imgBo ltsSt irrev ptheS ohnes ofTro yNowE xpect ation tickl ingsk ittis hspir
28 abaaa abbba aabbb aabaa baaaa babaa abaaa baaba aabbb baaba aabbb aabaa aaaaa aabaa
29 i p h e r w i t h t h e a e
30 itsOa onean dothe rside Troia nandG reeke Setsa Honh azard Andhi thera mJeom eAPro
31 abbaa aabaa abaaa aaabb abbab aabab baaba aabbb aabaa abbaa abbab aaaab ababa aabaa
32 n e i d o f t h e n o b l e
33 logue armdb utnot incon fiden eeOfA uthor speno rAeto rsvoy eebut suite dJuli keeon
34 baabb abaaa baaaa aabba abaaa ababa abbba baaaa abaaa abbaa aaaba aabaa abbab aabab
35 v i r g i l p r i n c e o f
36 ditio nsaso urArg ument Totel lyouf aireB ehold ersth atour PlayL eapes preth evann
37 ababa aaaaa baaba abaaa abbaa abbba abbab aabaa baaba baaab abaaa abbaa baaab aaaba
38 l a t i n p o e t s i n s c
39 tandf irstl ingso fthos ebroy lesBe ginni ngint hemid dlest artin ghten eeawa yTowh
40 baaaa abaaa aaaab abaaa abbaa aabba baaba aabbb aabaa ababa aabaa baaba baaba aabaa
41 r i b i n g t h e l e t t e
42 atmay bedig ested inaPl ayLik corfi ndefa ultdo asyon rplea sures areNo wgood orbad
43 baaaa baaab baaba abbab aabaa ababa abaaa babbb aaaaa aaaab aabaa baaba aabbb baaaa
44 r s t o e l i z a b e t h r
45 tisbu tthee hance ofWar NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
46 aabab baaab baaba aaaaa NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
In [62]:
decoded_message = ''
biliteral_values = ''
with open(decoded_message_dir + '.csv', 'w') as new_f:
  for row in range(0,15,1):
    for column in range(14):
      biliteral = biliterals.iloc[row, column]
      which_letter = decode_biliteral(biliteral)
      decoded_message += which_letter
      biliteral_values += biliteral 
print('Encoded Text Size: ' + str(encoded_text_size))
print('Biliterals Text Size: ' + str (len(biliteral_values)))
print('Decoded Text Size: ' + str(len(decoded_message)))
print('Raw Decoded Message: ' + decoded_message)
Encoded Text Size: 1050
Biliterals Text Size: 1050
Decoded Text Size: 210
Raw Decoded Message: francisstalbandescendedfromthemightyheroesoftroylovingandreveringthesenobleancestorshidinhiswritingshomersilliadsandodysseyincipherwiththeaeneidofthenoblevirgilprinceoflatinpoetsinscribingtheletterstoelizabethr

Dividing the raw decoded text string into Words using spaces:

francis st alban descended from the mighty heroes of troy loving and revering these noble ancestors hid in his writings homers illiads and odyssey in cipher with the aeneid of the noble virgil prince of latin poets inscribing the letters to elizabeth r

Providing basic styling to the message text:

Francis St. Alban,
Descended from the mighty heroes of Troy,
Loving and revering these noble ancestors,
hid in his writings
Homer’s Illiads and Odyssey, in cipher,
with the Aeneid of the noble Virgil,
Prince of Latin poets,
Inscribing the letters to:
Elizabeth, R

In [65]:
!jupyter nbconvert --to html '/content/drive/MyDrive/Colab Notebooks/T_&_C_Message_Decode_1623_v33.ipynb'

Finally, providing some visual styling:

Note that this exactly matches the paragraph “Deciphered Message” at the bottom of the page shown above in Friedman’s 1906 Riverbank booklet.

The Infinite Monkey Theorem

The infinite monkey theorem states that a monkey hitting keys at random on a typewriter keyboard for an infinite amount of time will almost surely type any given text, such as the complete works of William Shakespeare

What are the odds that a result like that, shown above, could have happened just by random chance? A long Wikipedia article describes a mathematical technique for quantitatively estimating this, using the The Borel–Cantelli lemma:

A bizarre echo is this: ordinarily, the Shakespearean connection is used just to point out metaphorically the absurdity of ultra-classic text being generated by random. Within this project, however, and perhaps uniquely, the applicability can be completely literal.

Scroll to Top