{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "6saJj6PoXkOf"
},
"source": [
"# Cryptography"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Aue46UK2YMW6"
},
"source": [
"**Why cryptography?**\n",
"- Cryptographic analysis provides distinct advantages over some more en vogue comp neuro methods, like deep learning\n",
" - It sits at a crucial point between supervised and unsupervised learning: you don't need training labels, but you also pull on pre-existing knowledge about the structure of information in the world\n",
"- Cryptographic analysis centers on using the underlying non-uniform distribution of data in the world to decode information\n",
" - This is something humans naturally do to learn -- e.g. children use morpheme co-ocurance-rates to learn language\n",
" - On a similar note, human adults are able to remember larger numbers of social relationships when they exhibit properties that make them representable in a lower number of bits \n",
"\n",
"**What will we cover in this notebook?**\n",
"- A hands-on example of using cryptographic analysis to break a substitution cipher in English"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Run the cell below to download data and prepare our environment!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"id": "dinSRX3QXKn-",
"outputId": "bf98b7a0-059b-46c1-f0c4-3eba91941619"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading package words to /Users/f004p57/nltk_data...\n",
"[nltk_data] Package words is already up-to-date!\n",
"[nltk_data] Downloading package gutenberg to\n",
"[nltk_data] /Users/f004p57/nltk_data...\n",
"[nltk_data] Package gutenberg is already up-to-date!\n"
]
}
],
"source": [
"#file imports\n",
"import nltk\n",
"from nltk.corpus import words as wordlist\n",
"import re\n",
"import pandas\n",
"from collections import Counter\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import random\n",
"import os\n",
"from IPython.display import HTML, display\n",
"import string\n",
"\n",
"#set random seed and download corpora\n",
"os.environ['PYTHONHASHSEED'] = '0'\n",
"nltk.download('words')\n",
"nltk.download('gutenberg')\n",
"\n",
"#make sure the display fits the width of the page\n",
"def set_css():\n",
" display(HTML('''\n",
" \n",
" '''))\n",
"get_ipython().events.register('pre_run_cell', set_css)\n",
"\n",
"def get_letter_distribution(text, plot=False, title='', zipfian=False):\n",
" text = re.sub(r'[^a-z]', '', text.lower())\n",
" letter_counts = Counter(sorted(text))\n",
" if plot:\n",
" if zipfian:\n",
" letters, vals = zip(*letter_counts.most_common())\n",
" letters = np.array(letters)\n",
" vals = np.array(vals).astype('float64')\n",
" vals /= sum(vals)\n",
" plt.bar(letters, vals)\n",
" else:\n",
" plt.bar(letter_counts.keys(), np.array(list(letter_counts.values()))/len(text))\n",
" plt.ylim([0,0.2])\n",
" plt.xlabel('letter')\n",
" plt.ylabel('percentage of all letters')\n",
" plt.title(title)\n",
" plt.show()\n",
" return letter_counts\n",
"\n",
"alphabet = list(string.ascii_lowercase)\n",
"random.shuffle(alphabet)\n",
"cipher = dict(zip(sorted(alphabet), alphabet))\n",
"for letter in alphabet:\n",
" cipher[letter.upper()] = cipher[letter].upper()\n",
"\n",
"original_quote = nltk.corpus.gutenberg.raw(nltk.corpus.gutenberg.fileids()[1])\n",
"encrypted_quote = ''\n",
"for letter in original_quote:\n",
" if letter in cipher.keys():\n",
" encrypted_quote+=(cipher[letter])\n",
" else:\n",
" encrypted_quote+=(letter)\n",
"\n",
"def decrypt(encrypted_quote, reverse_cipher):\n",
" unencrypted_quote = ''\n",
" for letter in encrypted_quote:\n",
" if letter in reverse_cipher.keys():\n",
" unencrypted_quote+=(reverse_cipher[letter])\n",
" else:\n",
" unencrypted_quote+=(letter)\n",
" return unencrypted_quote\n",
"\n",
"def fix_single_letter_words(encrypted_quote, reverse_cipher):\n",
" single_letter_words = []\n",
" for word in re.sub(r'[^a-zA-Z ]', '', encrypted_quote.lower()).split():\n",
" if len(word) == 1:\n",
" single_letter_words.append(word)\n",
" (first, count1), (second, count2) = Counter(single_letter_words).most_common()[0:2] \n",
" if reverse_cipher[first] != 'a':\n",
" for letter in reverse_cipher.keys():\n",
" if reverse_cipher[letter] == 'a':\n",
" reverse_cipher[letter] = reverse_cipher[first]\n",
" if reverse_cipher[letter] == 'A':\n",
" reverse_cipher[letter] = reverse_cipher[first].upper()\n",
" reverse_cipher[first] = 'a'\n",
" reverse_cipher[first.upper()] = 'A'\n",
" if reverse_cipher[second] != 'i':\n",
" for letter in reverse_cipher.keys():\n",
" if reverse_cipher[letter] == 'i':\n",
" reverse_cipher[letter] = reverse_cipher[second]\n",
" if reverse_cipher[letter] == 'I':\n",
" reverse_cipher[letter] = reverse_cipher[second].upper()\n",
" reverse_cipher[second] = 'i'\n",
" reverse_cipher[second.upper()] = 'I'\n",
" return reverse_cipher\n",
"\n",
"english = set(wordlist.words())\n",
"def get_percent_real(recovered):\n",
" english = set(wordlist.words())\n",
" reals = [word in english for word in re.sub(r'[^a-zA-Z ]', '', recovered.lower()).split()]\n",
" percent_real = sum(reals)/len(reals)\n",
" return percent_real\n",
"\n",
"import copy\n",
"def swap_keys(reverse_cipher, L1, L2): \n",
" updated = copy.deepcopy(reverse_cipher)\n",
" L1V, L2V = reverse_cipher[L1], reverse_cipher[L2]\n",
" updated[L1], updated[L2] = L2V, L1V\n",
" updated[L1.upper()], updated[L2.upper()] = L2V.upper(), L1V.upper()\n",
" return updated\n",
"\n",
"def swap_keys_inplace(reverse_cipher, L1, L2): \n",
" L1V, L2V = reverse_cipher[L1], reverse_cipher[L2]\n",
" reverse_cipher[L1], reverse_cipher[L2] = L2V, L1V\n",
" reverse_cipher[L1.upper()], reverse_cipher[L2.upper()] = L2V.upper(), L1V.upper()\n",
"\n",
"\n",
"def improve_deciphering(second_pass, reverse_cipher, percent_real_before):\n",
" english = set(wordlist.words())\n",
" c = get_letter_distribution(second_pass)\n",
" dists = np.ones((26,26))\n",
" for i in range(26):\n",
" for j in range(i+1,26):\n",
" dists[i,j] = abs(c[alphabet[i]] - c[alphabet[j]])/sum(c.values())\n",
" percent_real = percent_real_before\n",
" indeces = np.argsort(dists.flatten())\n",
" while percent_real < 0.81:\n",
" for idx in indeces:\n",
" i,j=np.unravel_index(idx, (26,26))\n",
" L1, L2 = alphabet[i], alphabet[j]\n",
" updated = swap_keys(reverse_cipher, L1, L2)\n",
" unencrypted_quote = ''\n",
" for letter in encrypted_quote:\n",
" if letter in updated.keys():\n",
" unencrypted_quote+=(updated[letter])\n",
" else:\n",
" unencrypted_quote+=(letter)\n",
" reals = [word in english for word in re.sub(r'[^a-zA-Z ]', '', unencrypted_quote.lower()).split()]\n",
" percent_real = sum(reals)/len(reals)\n",
" print(percent_real)\n",
" if percent_real > percent_real_before+(0.82-percent_real_before)/4:\n",
" print(percent_real, '\\t', L1, '\\t',L2,'\\n\\n')\n",
" print(re.sub(r'[^a-zA-Z ]', '', unencrypted_quote.lower())[35:776])\n",
" swap_keys_inplace(reverse_cipher, L1, L2)\n",
" percent_real_before = percent_real\n",
" break\n",
" return reverse_cipher"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZXKEjXeO0Sgg"
},
"source": [
"Let's use some cryptanalysis to solve a letter subtitution cipher. The text below is a passage from a classic novel in which each letter has been replaced with another letter from the English alphabet, with unique pairings. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 329
},
"id": "Ta1c1ZqS1qn2",
"outputId": "3d60dcc9-772a-4fec-c5b5-1d55c361f4a0"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Skxdbjf 1\n",
"\n",
"\n",
"Rcf Yxabjf Jaacpb, pq Tjaangsk Kxaa, cg Rpijfrjbrkcfj, yxr x ixg ykp,\n",
"qpf kcr pyg xihrjijgb, gjzjf bppt hd xgn oppt ohb bkj Oxfpgjbxmj;\n",
"bkjfj kj qphge psshdxbcpg qpf xg ceaj kphf, xge spgrpaxbcpg cg x\n",
"ecrbfjrrje pgj; bkjfj kcr qxshabcjr yjfj fphrje cgbp xeicfxbcpg xge\n",
"fjrdjsb, on spgbjidaxbcgm bkj acicbje fjigxgb pq bkj jxfacjrb dxbjgbr;\n",
"bkjfj xgn hgyjaspij rjgrxbcpgr, xfcrcgm qfpi epijrbcs xqqxcfr\n",
"skxgmje gxbhfxaan cgbp dcbn xge spgbjidb xr kj bhfgje pzjf\n",
"bkj xaiprb jgeajrr sfjxbcpgr pq bkj axrb sjgbhfn; xge bkjfj,\n",
"cq jzjfn pbkjf ajxq yjfj dpyjfajrr, kj sphae fjxe kcr pyg kcrbpfn\n",
"ycbk xg cgbjfjrb ykcsk gjzjf qxcaje. Bkcr yxr bkj dxmj xb ykcsk\n",
"bkj qxzphfcbj zpahij xayxnr pdjgje:\n",
"\n",
" \"JAACPB PQ TJAANGSK KXAA.\n",
"\n",
"\"\n"
]
}
],
"source": [
"print(encrypted_quote[35:776])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "a_CL2tY92Q6e"
},
"source": [
"If we wanted to decrypt this, we could try a few approaches. We could brute force it, trying every single possible combination of unique letter replacement pairs. This comes out to $26! = 4.03e^{26}$ potential combinations, which would take a prohibitively long time to run.\n",
"
\n",
"A more fruitful aproach might be to use the underlying statistics of the English language to help us seed this process with educated guesses. Let's take a look at how often particular letters show up in English text (as approximated by a collection of classic novels from Project Gutenberg). "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 851
},
"id": "BVbthXmHutQJ",
"outputId": "9d8570fe-be96-43e6-a816-55128bd08088"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"for fileid in nltk.corpus.gutenberg.fileids()[-3:]:\n",
" words = re.sub(r'[^a-z]', '', nltk.corpus.gutenberg.raw(fileid).lower())\n",
" get_letter_distribution(words, plot=True, title=fileid)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kXcnEeaj0UyB"
},
"source": [
"From the above distributions, you can see that some letters are used consistently more frequently than others across these texts. Let's take a look at the distribution defined be the average of all of these texts:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
},
"id": "YO6n9vk_0Wwk",
"outputId": "10d1e8ad-4050-4007-ab6d-2d36f031a961"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"words = ''\n",
"for fileid in nltk.corpus.gutenberg.fileids():\n",
" words += re.sub(r'[^a-z]', '', nltk.corpus.gutenberg.raw(fileid).lower())\n",
"get_letter_distribution(words, plot=True, title='Averaged Distribution');\n",
"get_letter_distribution(words, plot=True, title='Averaged Distribution; Re-Ordered', zipfian=True);"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rfY5CytS1EQU"
},
"source": [
"With this knowledge about expected patterns of letter occurances, let's see how they compare to the statistics of our encrypted text."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
},
"id": "c7Mqrp-46HCV",
"outputId": "2e96736b-155f-4ec0-938a-81e905f3cec1"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"get_letter_distribution(encrypted_quote, plot=True, title='Encrypted Distribution');\n",
"get_letter_distribution(encrypted_quote, plot=True, title='Encrypted Distribution; Re-Ordered', zipfian=True);"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "i6j1ATgyLvaX"
},
"source": [
"As the above distribution shows us, even though each individual letter in the encrypted text no longer has the same occurance probability as it does in typical English text, the general shape of the re-ordered distribution is still the same. We can use this to build a first-pass remapping to attempt deciphering the encrypted text, substituting each encrypted letter with the English letter closest in usage frequency.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"id": "7MG6KBzi7hit",
"outputId": "e34e2765-1a1f-4514-9145-0b190de67534"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"quote_dist = list(map(lambda x: x[0], Counter(re.sub(r'[^a-z]', '', encrypted_quote.lower())).most_common()))\n",
"english_dist = list(map(lambda x: x[0], Counter(re.sub(r'[^a-z]', '', words.lower())).most_common()))\n",
"reverse_cipher = dict(zip(quote_dist, english_dist))\n",
"for letter in alphabet:\n",
" reverse_cipher[letter.upper()] = reverse_cipher[letter].upper()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 329
},
"id": "kso6pkEXZeuE",
"outputId": "1ad4fc0d-8661-49fa-a657-a86a6a954228"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fiabter 1\n",
"\n",
"\n",
"Snr Wadter Eddnot, oc Keddyhfi Iadd, nh Somersetsinre, was a mah wio,\n",
"cor ins owh amusemeht, hever took ub ahy pook put tie Parohetage;\n",
"tiere ie couhl offubatnoh cor ah nlde iour, ahl fohsodatnoh nh a\n",
"lnstressel ohe; tiere ins cafudtnes were rousel nhto almnratnoh ahl\n",
"resbeft, py fohtembdatnhg tie dnmntel remhaht oc tie eardnest batehts;\n",
"tiere ahy uhwedfome sehsatnohs, arnsnhg crom lomestnf accanrs\n",
"fiahgel haturaddy nhto bnty ahl fohtembt as ie turhel over\n",
"tie admost ehldess freatnohs oc tie dast fehtury; ahl tiere,\n",
"nc every otier deac were bowerdess, ie foudl real ins owh instory\n",
"wnti ah nhterest winfi hever candel. Tins was tie bage at winfi\n",
"tie cavournte vodume adways obehel:\n",
"\n",
" \"EDDNOT OC KEDDYHFI IADD.\n",
"\n",
"\"\n"
]
}
],
"source": [
"first_pass = decrypt(encrypted_quote, reverse_cipher)\n",
"print(first_pass[35:776])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DqPKao5xaJnj"
},
"source": [
"While our first pass definitely gets us closer to the original text, it's not quite good enough (unless you, like yours truly, happen to be both a Jane Austen fan and one accustomed to reading through heavy mispellings). \n",
"
\n",
"At this point, we'll want to use some basic facts about English to help us out. For example, we want to make sure that any single-letter words are either assigned to A or I. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 329
},
"id": "laJUmPcSPL5f",
"outputId": "982727da-ecb0-45ab-bed7-745fef887157"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fnabter 1\n",
"\n",
"\n",
"Sir Wadter Eddiot, oc Keddyhfn Nadd, ih Somersetsnire, was a mah wno,\n",
"cor nis owh amusemeht, hever took ub ahy pook put tne Parohetage;\n",
"tnere ne couhl offubatioh cor ah ilde nour, ahl fohsodatioh ih a\n",
"listressel ohe; tnere nis cafudties were rousel ihto almiratioh ahl\n",
"resbeft, py fohtembdatihg tne dimitel remhaht oc tne eardiest batehts;\n",
"tnere ahy uhwedfome sehsatiohs, arisihg crom lomestif accairs\n",
"fnahgel haturaddy ihto bity ahl fohtembt as ne turhel over\n",
"tne admost ehldess freatiohs oc tne dast fehtury; ahl tnere,\n",
"ic every otner deac were bowerdess, ne foudl real nis owh nistory\n",
"witn ah ihterest wnifn hever caidel. Tnis was tne bage at wnifn\n",
"tne cavourite vodume adways obehel:\n",
"\n",
" \"EDDIOT OC KEDDYHFN NADD.\n",
"\n",
"\"\n"
]
}
],
"source": [
"reverse_cipher = fix_single_letter_words(encrypted_quote, reverse_cipher)\n",
"second_pass = decrypt(encrypted_quote, reverse_cipher)\n",
"print(second_pass[35:776])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MC6_2FSeb8W5"
},
"source": [
"Intuitively, this text feels closer to English text than the previous two. But at this point, we might decide that we want a better metric to determine closeness to the original text than our gut feeling of what looks better.\n",
"
\n",
"As we go through the decrypted text (which is significantly larger than the single-paragraph sample displayed above), we can use a cannonical list of English words, then check what percentage of the words in our recovered text are true English words. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"id": "93peeSaFwrOj",
"outputId": "57dd7c76-eaf3-426c-f5a2-c380ea1ca427"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.29535548269005385 % of recovered words were valid English\n"
]
}
],
"source": [
"percent_real_before = get_percent_real(second_pass)\n",
"print(percent_real_before,'% of recovered words were valid English')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5X0JnV5QdbGY"
},
"source": [
"We can definitely do better than 30% -- in fact, the original text contains 81.7% accepted English words. In order to improve our decryption, we'll try swapping out letter mappings for letters that have the most similar probabilities in English (i.e. R and S both constitute approximately 7.2% of letters used in this corpus). If the percentage of accepted English words improves by making a substitution, we keep it. Let's watch this technique at work. *N.B. This make take a few minutes; feel free to make a nice cup of tea while the next cell runs!*"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "oxKSeu6d3h1k",
"outputId": "2ad83429-c92a-4671-8fd1-aea9925a6148"
},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'get_letter_distribution' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m#@markdown Run this to improve the deciphering! { display-mode: \"form\" }\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_letter_distribution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msecond_pass\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdists\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m26\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m26\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m26\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m26\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'get_letter_distribution' is not defined"
]
}
],
"source": [
"c = get_letter_distribution(second_pass)\n",
"dists = np.ones((26,26))\n",
"for i in range(26):\n",
" for j in range(i+1,26):\n",
" dists[i,j] = abs(c[alphabet[i]] - c[alphabet[j]])/sum(c.values())\n",
"percent_real = percent_real_before\n",
"indeces = np.argsort(dists.flatten())\n",
"while percent_real < 0.81:\n",
" for idx in indeces:\n",
" i,j = np.unravel_index(idx, (26,26))\n",
" L1, L2 = alphabet[i], alphabet[j]\n",
" updated = swap_keys(reverse_cipher, L1, L2)\n",
" unencrypted_quote = ''\n",
" for letter in encrypted_quote:\n",
" if letter in updated.keys():\n",
" unencrypted_quote += (updated[letter])\n",
" else:\n",
" unencrypted_quote += (letter)\n",
" reals = [word in english for word in re.sub(r'[^a-zA-Z ]', '', unencrypted_quote.lower()).split()]\n",
" percent_real = sum(reals)/len(reals)\n",
" if percent_real > percent_real_before+(0.82-percent_real_before)/4:\n",
" print('swap', L1.upper(), 'and',L2.upper(),'\\tpercent valid English words:', percent_real,'\\n\\n')\n",
" # print(re.sub(r'[^a-zA-Z ]', '', unencrypted_quote.lower())[35:776])\n",
" print(unencrypted_quote[35:776])\n",
" swap_keys_inplace(reverse_cipher, L1, L2)\n",
" percent_real_before = percent_real\n",
" break"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EnhDUjmsqueW"
},
"source": [
"And here we find outselves with the fully recovered opening paragraph of Jane Austen's timeless classic *Persuasion*, decrypted in a computationally feasible timeframe, based solely on our pre-existing knowledge of how frequently different letters are used in the English language.\n",
"
\n",
"Now that you (hopefully!) have a stronger intuition for frequency-based decryption techniques, my recommended reading is [A cryptography-based approach for movement decoding](https://www.nature.com/articles/s41551-017-0169-7) from Eva Dyer and her colleagues in Konrad Kording's lab, who used this frequency-based approach to decode motor activity from macaque neural recordings. "
]
}
],
"metadata": {
"colab": {
"name": "Introductory Cryptography for Neuro",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 0
}