+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Done 43 for key frrifbjmzdxmsslrwami\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Process ForkPoolWorker-855:\n",
+ "Process ForkPoolWorker-854:\n",
+ "Process ForkPoolWorker-853:\n",
+ "Process ForkPoolWorker-857:\n",
+ "Process ForkPoolWorker-856:\n",
+ "Process ForkPoolWorker-863:\n",
+ "Process ForkPoolWorker-858:\n",
+ "Process ForkPoolWorker-860:\n",
+ "Process ForkPoolWorker-859:\n",
+ "Process ForkPoolWorker-861:\n",
+ "Traceback (most recent call last):\n",
+ "Traceback (most recent call last):\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ "Process ForkPoolWorker-864:\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ "Traceback (most recent call last):\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ "Process ForkPoolWorker-862:\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ "Traceback (most recent call last):\n",
+ "Traceback (most recent call last):\n",
+ "Traceback (most recent call last):\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n",
+ " self.run()\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n",
+ " self._target(*self._args, **self._kwargs)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1162, in autokey_decipher\n",
+ " keys = keys[1:] + [plaintext_letter]\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ "KeyboardInterrupt\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n",
+ " letter = unaccent(accented_letter)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n",
+ " letter = unaccent(accented_letter)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n",
+ " letter = unaccent(accented_letter)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 37, in unaccent\n",
+ " translated_text = text.translate(unaccent_specials)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n",
+ " result = (True, func(*args, **kwds))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1159, in autokey_decipher\n",
+ " for c in ciphertext:\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n",
+ " return ord(letter) - ord('a')\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 38, in unaccent\n",
+ " return unicodedata.normalize('NFKD', translated_text).\\\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 909, in autokey_sa_break_worker\n",
+ " new_fitness = fitness(plaintext)\n",
+ " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n",
+ " return list(itertools.starmap(args[0], args[1]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 37, in unaccent\n",
+ " translated_text = text.translate(unaccent_specials)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 153, in caesar_encipher_letter\n",
+ " cipherletter = unpos(pos(letter) + shift)\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n",
+ " letter = unaccent(accented_letter)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 139, in Pletters\n",
+ " return sum(Pl[l.lower()] for l in letters)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 139, in <genexpr>\n",
+ " return sum(Pl[l.lower()] for l in letters)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 21, in unaccent\n",
+ " def unaccent(text):\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n",
+ " plaintext = autokey_decipher(message, new_key)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n",
+ " return ord(letter) - ord('a')\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n",
+ " return caesar_encipher_letter(letter, -shift)\n",
+ "KeyboardInterrupt\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n",
+ " letter = unaccent(accented_letter)\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n",
+ " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 39, in unaccent\n",
+ " encode('ascii', 'ignore').\\\n",
+ "KeyboardInterrupt\n",
+ " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n",
+ " return ord(letter) - ord('a')\n",
+ "KeyboardInterrupt\n"
+ ]
+ },
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m<ipython-input-23-253a2dc839fe>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0msct\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscytale_decipher\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mrsct\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreversed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msct\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mkeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mautokey_sa_break\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrsct\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mworkers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_iterations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10000\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_keylength\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Done\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"for key\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m~/Documents/programming/national-cipher-challenge/cipherbreak.py\u001b[0m in \u001b[0;36mautokey_sa_break\u001b[0;34m(message, min_keylength, max_keylength, workers, initial_temperature, max_iterations, fitness, chunksize, result_count)\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mPool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m breaks = pool.starmap(autokey_sa_break_worker,\n\u001b[0;32m--> 879\u001b[0;31m worker_args, chunksize)\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult_count\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbreaks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mstarmap\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 266\u001b[0m \u001b[0;31m`\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0mbecomes\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 267\u001b[0m '''\n\u001b[0;32m--> 268\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_map_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstarmapstar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\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 269\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 270\u001b[0m def starmap_async(self, func, iterable, chunksize=None, callback=None,\n",
+ "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 600\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 602\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 603\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\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 604\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 597\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 598\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 599\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 600\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/lib/python3.5/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 549\u001b[0;31m \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 550\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 551\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/lib/python3.5/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 291\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 292\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 293\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\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 294\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
+ "source": [
+ "results = {}\n",
+ "for n in [43, 101]: # range(1, 61):\n",
+ " sct = scytale_decipher(scb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" decipher for key\", keys[0][0])\n",
+ " \n",
+ " sct = scytale_encipher(scb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" decipher for key\", keys[0][0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "results = {}\n",
+ "for n in range(1, 61):\n",
+ " un_n_l = int(len(scb) / n)\n",
+ " un_n_h = int(len(scb) / n) + 1\n",
+ " \n",
+ " if un_n_l not in results:\n",
+ " sct = scytale_decipher(scb, un_n_l)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[un_n_l] = keys\n",
+ " print(\"Done\", un_n_l, \"for key\", keys[0][0])\n",
+ " \n",
+ " if un_n_h not in results:\n",
+ " sct = scytale_decipher(scb, un_n_h)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[un_n_h] = keys\n",
+ " print(\"Done\", un_n_h, \"for key\", keys[0][0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1 ['aledonian', 'tritchals', 'yhistentg', 'ecaledoni', 'ohewiteri']\n",
+ "2 ['opanedanh', 'ovactenep', 'nfaresnee', 'cinditoat', 'mbeitandr']\n",
+ "3 ['rldmtheni', 'cdcouitth', 'yturesotv', 'erldsmist', 'rmorohatu']\n",
+ "4 ['otimmenux', 'uderizesc', 'dstotaude', 'termedovi', 'rfrithada']\n",
+ "5 ['utiakeeda', 'ksackhist', 'stosainla', 'ovinicood', 'gmistreca']\n",
+ "6 ['bilitbuta', 'llintmakf', 'ttisetacu', 'tprincova', 'sdonstisf']\n",
+ "7 ['chorofesl', 'ybehedank', 'ifasthaco', 'ttesenoap', 'ialreralr']\n",
+ "8 ['fwendisuc', 'yancovidl', 'neinemilf', 'oencetief', 'thadegica']\n",
+ "9 ['orthetcaq', 'rnstroulw', 'rainomisl', 'nheiromak', 'netwomenu']\n",
+ "10 ['upofrotow', 'eficehadh', 'lgirentsz', 'poinomasc', 'lathefisw']\n",
+ "11 ['averedutj', 'brithoisc', 'tvertheht', 'zalontedi', 'architinf']\n",
+ "12 ['yeaustieh', 'ustspeepa', 'eusendasm', 'rolocline', 'xcendmant']\n",
+ "13 ['ojarematt', 'sssdesort', 'alimameat', 'ptisoustb', 'hanssonsh']\n",
+ "14 ['ebingitob', 'retairott', 'phinoteel', 'umeningfr', 'atteitior']\n",
+ "15 ['pfthemelr', 'jasttonai', 'lwasergeh', 'dfatheint', 'xconthecl']\n",
+ "16 ['iclayarow', 'utontoisk', 'rtinsdarn', 'oatritisr', 'psarcheci']\n",
+ "17 ['guaniethr', 'irpushing', 'rluctindw', 'wbonecesh', 'ttobontsc']\n",
+ "18 ['pateosesy', 'olecultil', 'aradsonsb', 'deusittho', 'utiosindi']\n",
+ "19 ['uelisidil', 'rttrtionr', 'aheleatoz', 'oltssanan', 'ljonstant']\n",
+ "20 ['rragaimet', 'tlassstss', 'fatanboup', 'ilainsnot', 'eeinsousa']\n",
+ "21 ['itaboyonf', 'goordalia', 'acanymerr', 'peawitesp', 'rfthemild']\n",
+ "22 ['ofuternon', 'rthisioir', 'anarcharq', 'learetsoe', 'tariedesl']\n",
+ "23 ['trecintlt', 'apearface', 'falasponh', 'clegehest', 'oeavathen']\n",
+ "24 ['eplyouass', 'edighsida', 'rethninwa', 'lnonoketh', 'eedrontle']\n",
+ "25 ['llrosinea', 'enerennik', 'shecimesa', 'tathoodif', 'atesthunk']\n",
+ "26 ['yliperane', 'veadescit', 'upanitiss', 'avatintii', 'olinotecr']\n",
+ "27 ['toresitja', 'shinimasb', 'ksantmerr', 'hopeitese', 'stimenttb']\n",
+ "28 ['hothatdtr', 'allsmitam', 'yafratide', 'cisanshol', 'reontreal']\n",
+ "29 ['egussinst', 'anescheem', 'ldisemort', 'eharecrie', 'uresfornm']\n",
+ "30 ['fundabefl', 'fatmeindn', 'avelrimag', 'otosateog', 'culdiledt']\n",
+ "31 ['iharenssg', 'rlineasdr', 'nlastadei', 'geansisep', 'ntirstedp']\n",
+ "32 ['tmpreledb', 'nsasssath', 'ystmaneck', 'yralactoe', 'colithike']\n",
+ "33 ['lsorsostv', 'ghaltilde', 'xhinemini', 'lsicanumb', 'nsatecefe']\n",
+ "34 ['ulaboyerl', 'yaisoreda', 'lppriendc', 'pearetakk', 'tasanttob']\n",
+ "35 ['ilacesswf', 'ineintylt', 'xatirondo', 'indeearex', 'chaveinal']\n",
+ "36 ['btymement', 'gookitenj', 'uheinangm', 'siopesall', 'eanrentah']\n",
+ "37 ['ccicelini', 'slidelteg', 'tiremmera', 'favisetie', 'tlactianw']\n",
+ "38 ['anosseabb', 'ppityrace', 'rbememaid', 'ccomplyta', 'latifeasm']\n",
+ "39 ['chigisidh', 'yoncestns', 'mbargendd', 'inedemoom', 'undmomenn']\n",
+ "40 ['fminararl', 'yhodonalk', 'scesidivi', 'elitepoid', 'glinseniv']\n",
+ "41 ['ipteislet', 'ncapelerl', 'tyinfisth', 'flasediol', 'tainemisc']\n",
+ "42 ['dansssecl', 'vearymasp', 'rlamegina', 'chinetger', 'dkiliongt']\n",
+ "43 ['yroffinoc', 'fkidetont', 'ystoolthf', 'idaminowt', 'erveotior']\n",
+ "44 ['onchehedl', 'trneinate', 'ortlerewc', 'ircherray', 'plondemag']\n",
+ "45 ['iclacciti', 'palawenta', 'tticttien', 'rnaledbil', 'uttemally']\n",
+ "46 ['peitteryt', 'irthetpul', 'tcaroderb', 'chehedesc', 'epereginr']\n",
+ "47 ['hitsopano', 'ntanonitq', 'keptietel', 'cherduchl', 'ragnotima']\n",
+ "48 ['ntssertnu', 'ailyanide', 'efandigie', 'ftsofstan', 'ragroungi']\n",
+ "49 ['dpiretalh', 'mthleterh', 'ilagatank', 'lcstoresh', 'mendveten']\n",
+ "50 ['teldebrid', 'tandtdedb', 'rfirastot', 'ntarsdant', 'cresnorne']\n",
+ "51 ['ehinirtht', 'ngontrysh', 'progetush', 'leacerioc', 'ovichesna']\n",
+ "52 ['rrinexhem', 'ealmelalf', 'idathrehr', 'ylesoying', 'shiberofe']\n",
+ "53 ['lgamerdsf', 'yjoumandr', 'dnoncielo', 'ploconnot', 'grichinsh']\n",
+ "54 ['iteteinng', 'pdimesisb', 'mregiendl', 'dtriccesn', 'oachofinf']\n",
+ "55 ['rcetstaye', 'bautsinet', 'ugharounl', 'catastsiz', 'epericalj']\n",
+ "56 ['krastusee', 'odesedoog', 'nagromalr', 'ymprelesh', 'mottelerp']\n",
+ "57 ['appolislt', 'yhewitstb', 'tsamerapf', 'uyeistort', 'eiswatinj']\n",
+ "58 ['roineenia', 'tainnialr', 'eremoussu', 'gtainandl', 'treantthd']\n",
+ "59 ['mwichitab', 'kjuntensh', 'ptothlele', 'jhersisei', 'lyonamaso']\n",
+ "60 ['uelibecho', 'larnecitr', 'fhicetitl', 'tanpesall', 'pricedssp']\n"
+ ]
+ }
+ ],
+ "source": [
+ "for n in range(1, 61):\n",
+ " sct = scytale_decipher(scb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " results = autokey_seek('caledonia', rsct)\n",
+ " print(n, [r[2] for r in sorted(results, key=lambda r: r[-1])[-5:]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rwcb = wcat(cat(reversed(w)) for w in cat(c for c in cb if c in string.ascii_letters + \" \").split())\n",
+ "srwcb = sanitise(rwcb)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'ycerevvtltfiewhxbxxalvfaanfkmzkjvvhdsvdyqlnlerhlnghkaiocsnqzeiocavghaabghzoebajclrgcumsnqwalgclpdrbvqxtvwjgvljaqbgxrgmhzayqamkkmvgalizfkjylnqrilkxbkhphjkstyhpavuvedizfaevzwrfqaqwxwoafaljtzwzkentgceqihguzkartwmxnlhptcsucthihqhvjaekkjtfevvrpzntsabgazlkrppthezuwlwdoabvctemhrhjjrdriljwpgzwzlruhhdnqstrardotsowzlitletapvbilivjzaexaljtfkttvcrizlhrnggivftnmaasrirychtalquonahtyaegclphrbvinnrdkynqrilerqewaauclrgcwmiayxzvavvtcditpllawtvjlwumkikczduvgaiazlpwmfxkryehezmilfkjypadhvjslfmlbcsnjzfhgxivjslwdgamnleucranqesrvzvfamnfzhvzpzglmaemzctdzwsnqwhlqafrlpstyaeqqrulvvetvcrizlhrvaokfjervvthzralhdycbehumlxhdndvltrmdvtzalmqrpctvjddhttalcacnghsetarfihqwaljtftfaglejprtlkoaqgctlsleavuanaalcrhcorewcsvnnqepbrstsrvzfvnwhwptvrtxwgaqwheekzgzdvtxpjotfmgnbvlrhcvzvkayfkoslfslbcmsnqlimfeqbixhwhogxveaebaaalqqzznfgttfrlwspaffufelkslfmlicmaaklbtwlroamnnnqlimghdhvypauqaymndhbehumlxhwaoianpimnfmvtarfamnflbtwxeenfkgaqxapvgzhaqizzrfgtarrwwydwfaxltbcgmnqlblyrofzwimkmharzevkalppwkanjarkahtlgcbgaeqqrjetwenlethrdrbovrnqpofvwsvvgkqqxhvrvlhtjihwaeqewpgzwsnqlfsbdgfuxvwkzastfirzmdhmeitwdgcbuhvzxofvgqbfalhvnhhtbugmlwrhhgkxtsemnleucdufamnfksfjpyfvaqeshdgkabmpfjllvtnpatbuqgclrgcwmwwibxhdnqzwtcjlhxhgbtslnuxjkhwahtmalrfamnfoavvwmfknkkmrgejuaakorrhwalrfwngtmqwkwrtkvthgslfmlbcmgfkjvzvtvtecgivrbzjhntkjtrkalplnqvgthalphrbvierijyqhgfauawhvsfjtpsksgkelwokevtyslfmlbumlhfvxnleghrfaqmnmlegxvehwhzpevzgclehrbvianqqrzevivxnlegalgalphrbvqphdwwkqqbqlbbwbfrfaqqgmltbbndrbgalvvqmivivtygzolmvjgfyalmfqaspkoobypevdvtzalmmszvgltgkwsnqwalgqrhbjgslkvqmivntvcrizlhrnrizddntovefaqaebaoinmalgqrhbtoifofqbqhqzfalfmlbcmlhqgrktivqhetahndklgqifoqrzzrrgxvixhgmwjtxvdetvnalwlitwadgkwwkwhtalqabfyxrujicmxtfxkvpyndlammhtgvallodthwhhkrdhxhhttnqwalvvqaivvvtrpkowbnnizvwgtyalmxqamtfypagkjfwvihrakcereivtubyjdtfypsgkjfsfjxrqslfmlbcmjzacodxhqhvvwlbumtbvtnpaxtsfvtbvqrwvtygvlaldgihqhvvwliumtxhwalpzmallnqxjgzonammrtwmxnlhptumucthkdvqqiloqrzzvsfxkryralwgzolmvjuhqhvypauqayanqhbmdgavtzhpaxfttlwlcmotodxjkqqrglalfmlbcmuqbqeqzrhkpuewpqivupagkjjkfusvrwsxbkpalqivqrtfsgzolmrctsogcthpzrhlkurvalrmcerjgthcmbpiotivtnhvzlhruhnrhkpumnqkllasfbhmalwmvulpxrrhvhrspirudrbknqfwhaivtzavianaleergtllgottbriafbhmalqmrbotfmmnytsogcthonqkpalhfpwetwqtfxkxapmuvgklnaaalmxqaspkowbuhdsmzkjvvhvwzzrvpjdwfafalpiogtnlvxahtpaskdzkhjburwngbonatrfihqtalqnzaclrgcumsnqkpaeqrqyqwrgxvpynqkuhtkvirvvgkhtalrbpmpvfamnfodvkavvvvhuwghwhsqmckitxhjnvgllujvksvtubgalfjbtxvsjtpstyalarifugnpgenqrrppckwimutlepermtyalmztoaymnqhvjslfslbcmsskslfmtbcmkugrgxhwhlvrnxyrrilffrgnbvlzfkovnvvtzhtntweaeeizyltjhvazehwalqqrjebadhgkumtbwbfgmajzhwhhxerjbznxbrralmztoaymnqhvdmrtumxnlhptcmucthkwsxnvnlwjptvjmudhhwhhrvetlwgtvxejwebajclrgcwmftfkalwskosthpaeqrgabmabwwslahtvcthviuewpqykvetxdzebajclrgcwszlgcrvjzfwjpgvtprvhdnraftfxkvpmtyalcqrhbxnqwhuktalvnebaaalwtkfbtkwlhtyaevvqmivvvtrpgowbanizvwsrrvwlxhvslfmlicmsnqkpayauruvxtfkalgtzmqwlalcfhdfqmyubmxhdggivslmalvfamnfglolmvjavrbzjantkjtfjsfjtasksgkjwfafaatalpwzbrerkhjcthctkjvvhtaljtfxkvpyndwaltgzagbrvslhqclrgcwmsnqkpaeqrfgwbwwslahtvcthonqkpaeqrevxnrerhwhqcrizlergalmzylerkszlevtuebaaaewzhmqstyalmrsbrxgivjebatalhhzdttvgaegqzootonahtddwjpcthamrthlhwalwmlmddofjoebaaalxpooqkctlejqjgntnponifjtfvtalqabghonnwaibbvthbrhkypgfjdaawbrhzibacdbtldsnqwwtxvwtfwndzddyqsszllhddgxvihzebajclggcwmklkrpetdwbonamhvpatorbshqhvypasrdailylgqbpgalphwalxklygodnmtyalgqrhxevzolvtovupstsveslialtxtalwwgwlzbrmfwfaqenqvghaemfqaspkowbprfgkwhwalwwethukvdmnviivfjvzwfdmksvtllnqiflwltefgjxhhgnbttvjrlgfpkrdyqdltxvwwvihiwfatalmzkhfdqrgofjuclphrbvqanqufamnnltsexalcpvwlxhdnqpmdhwsctznikgwgtluotlsnqvzlitxvtxrtbbnxhjtfkalizjsfjhhptdzrrnpgsjzvtqaeaebalbehumliwbgalcqdptiuhgbtealcfhdrvgqjzvvhvmzfnkkmrgejrhqobgbvhysbghhhljtfkkvwkstnbjdwamgamodevvgcthfvtdftxhwhhalppkgtnmgtyalbqasekowbtkquvnanqdtelslahnqehwalgqrhbqhhpaksfjooitxntxvggmddvtcofulvefaqstyhlvvgqjzvpmttalgqrhbxnqwhlvvxnlebtyaexpkoqkctlegaewsrxxrngxhtalqmlwaprurnnnqdwwruhhserfawbflhhalsmlmddjfjwechahfvggmdzefardatkndzllvehlcgidlrgalypvxbzvhiwfamuttbtrpqwvmikgkrzfpuwsvervmhwhhavgwbsrvzppkowbaaizvwtvnbpvdexapazpalhfpwetwcvwlhfvxhlmzyvbbilvrequmwgtwfaqaevvhhrvmhwalcqrhblqewfetrlgnzralkxvetlsctznnkgwgfhcthonqkpaeerevgqfulvtzhlmzktlpmahtryhphlalqagliubdfktngmtsksphvzyhqhvkakornsshpalhrzinnnqlbipinfeqkxvetejrhhtmhqqbgbvhexhdgfhxgvbbtalxklnatgmlbfgqbpgelphiofdmnlekrrvrtbwbflhqqaqcexbeetwcvwlbnctecgoxbkevgzahtmahtmkltadetwzbrhdybfxhzojauruhdxhgbtealroztalkrzfzwimoobqhvjgtyalenpkmrgpkfco'"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "srwcb"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "('attttttttttl', -23081.56936918698)"
+ ]
+ },
+ "execution_count": 102,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "vigenere_frequency_break(srwcb, fitness=Ptrigrams)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 119,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "('oeypytyhyttnttytoty', -6818.515331904816)"
+ ]
+ },
+ "execution_count": 119,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "beaufort_frequency_break(srwcb)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'qcuyuydonaofpxrwnwbotdkytlcohudkydmlbdlgieliuqrighmjylargbozlqfwhdnmntssmpfunepnncsfehbadxyiirnzbhoddbodxkhyiptyssrnsdruyjithdjhdnoiqpzogailrhlidwsomzmpemfrreymeypkluttkyzsntzydckcftitipapxzealwsrurqmntujycvxmrrnijawperaglmimtkykuogfoumdceogagtnnyptoyjefauuzrixvfosdmludrcrypcqwlipxznzsfnyemreldbucthqaagaizeqandftesslnltkzoabpnkfcoaasrcqudmhbyshdofumttvclhvmmfotivkgyafvtjnrnehcxtwlchqojldcfiphdkxyokwehnwlmltpwudttyfmbqwjinhcayeixehelomfvvdnyzyuiyxhtwecakxuqmlncokvytqryfbnjsnowblyzomhwldkwiclyydliunwctadpgctudjemcturmzeuhihypcuwvbztggilridnocnewaaoaizhznmdpasrcqudmhtekftkuqdyagucyihqamduiehnkrqgkyifccqdvfyemdhswayeqqravtnmewcsmgdftcilmixoipvzfkynndpecuijktynwvtgeutdnygtnirhmmfhkiwxdglrueswbagctuttrcicefmhawrntixhpuefsqvyfkjkfuohsgnynxxwuzyohaojzbitbdswcmlznlmcudsfwmcmanbtaylxtyhnddougtnvatxtcxjttceopcjbnociqmsypoixociczthlgbdngssivmdjjtzxtvmglmxkxednwrlyflngeqhbomtlyyttmutisuxwupbooieisyedbzmtxluzcjnfonhtcvvlttwcaswncgiddnrhfticlhdhmycppdeenajxohlktwjtradnwnyylidhyuaxjgiuahcvxdkuhgiskoyrbydnedirxdydiroplmrtpipsespigciitpxqnizwdxeuywlthhumerhpfaxvnmsehjzskodbisonimdghmfnksdnxharnjqabuhbiuucvvttmutjbikeaottikmrmsjygmeoeiidabeyvdezsrnqsrxbxxqsrmvboztfrpwrwmhsagibzbfurtymfvyicithloatdtimkogoxmcnjkzytefhxxcpnctllnabdxoxxaotlrjgitvnsrbnooktudvjflwnqmhsuemgfjfaheenangimsamniercnyqknqgadrbttznxmdbjkfzmoxsjuwcfjjyaabdomddednmtmbgijnmhoodmbsnlswddrxmoepduirnkxhodlyuidcopyqyrgnkyyestnsrcssderqsxoyoxznsxlxocitdincifndlmhsshnyyxhldltaaifkemypbtvtchoitweoaqxrjpdedaunihmbpysdlsfcblrctihdcrsfngdudzmldufyrwlunmxghgfvmlakmuotxtpxtallcenjicrgfflifoisymipzyethngwhigdnhjvldyxuwymleoinxlokdxuzxnssdlbashxeawdqkadbentnlflyqndxxoxhaydoyotvbqekllhwforjdzglmntmvranstinflarsxrfhqrkrmaugdctdydyequdyfqjjfrsgllpycilapnhbryhaiveynektsjqihtofucpfyaesqkvvzaagnoytboewcibdomddwdpuyfkqwgdmdysixusfodalsywavoyfstdhsjfrsynhnqnfmdrytxngkmwbmchneubtingywpifkcyhmqfxhqgirevzmucfioqdrilizdczutbtruhrhtnlsufchypzhdrtgjpedyjygdgshvnoyfpxjpbofonxilhffflwpeoiysiywthimrhednduyfhioeedcedfyzjtijpfutvgyhlgwsdetndgyixltxsukwmcrubfsrvmjpnreozhmyicbrphkiarmsxaqffzdaggyunmxzrbnrfjzmuijictbtshhydimueijkhcmsmcgegcelnxfldtlrtlsauyygtlotulhnfwnnfuashlooxhsyeihhgkaobhgaawfsmlrbldosyimiexuasdfjhosyemndnjcgtytdhbyegaofcgemqvhuoktyrtizqhyjyvxonotnegfsvrnubtrojtbdquomfsexiljxflhfcofmdftddlpewehnwnmbgxjeypyciqocyswdsagddzmfjtlhtjsfraywhsebeyttcgtabdfyydmdmzrnmcmwdmmuqwbmpudniczkdjwyfudspnopgfwyvkajbvvydehhtzsujnpadchezroswmvfiusuchuvtnhpakogmcimdygioviswhwbowttdfswvoznwnwrxhidxrbrhcqwtochgsdipooajludazafgarptupguadlpidtzdrxtcddhkksylxsfehfgcsohhtpuhxrhhuypszubscwtimuvfyqslzryvvhazbwgnmzawckwwrjcpbgyaixpevypckvirxrahypuixsatwufiuoykwwhnrrhofoetnsmobgarsypdwntxhoscsmnpradffmyfzpceyvotafsvuugykrccnwxwunichuputlpensaehyhqlxetwtwomjhaptiwdxmxrritrzooyiyapsytoicvutofjcwravnpyddcldtjfyjnklxtgfuycbxcdstbidbncmillhbldeeyqeeyeybotjtcnazhyxnotwkrqtrmvzmhwrqinqtmndyidcyhginikicypojhozkyufjkuokgofaywugjokccyotnatnesuxxahfrkworradkydmvtnfltsoyjjlqxniasuonxxjgerdwwhnrrhbldeeykohksxxlcbinmadrvmkbooaypiquywacphmsmimnqqnphbyihoviucebzdadwepxhytprummdwaaotmygshkslyepsyaoirhfvwfyshundoffffbtrvbvtpeworthwamnmstnssndvqkcpfpmttyirekaoonfiuyiknaagjfbltfltuftnrysngfglxolxnjfixcrxaenikqytsshhfqoyrvgfiqvgdcxvwdslttlqzevvdvbunihqvihdhruugykrcnnwxcjnenjlfqcgkgtbmyjtvfhnmrzryasybcktlnvdninpspnerlyiwdivsflgmvgyesdhabpyofidaayezmfxdpgwqtiuwayisxsstzohhtlttdjgddnhtuczipgeotcsewonoxhxydiclfmexdqhaylqyjkdpitmmjgmfiiadltisifkzsgbmrblsauykhiiojenvriqnobyxrylrlsoyvendzjrcvdchfopzmijhnxuitlreotbggnawpbotwadxnkrqgxehvmsbwvflhoncbfizzaiggyyzdwfsdabqfssawmpajjydwzggopareakuchgzngffdwituhustcsprzciqsdspnriejaltmnxaktnmzrmhysrpuysmymujgoeshjukhaifshsyrvwsshxrepatxoyxdbalsfqcosspmfvddynlamtyvqtvhrtrmywjejhagmnvvyddipgpotcsaddzdgogilluegiyaldpgxtnnycrnorijtoptkfzlabgvwdiymmvyffkozcypttybfqxnudniyzyebaayiidhhdbcixrwdywaipxaqturpobijwonpnnpxgcrwhbybiftnrmixnececbglybcthzragpcitxxodmrotgdnhvepokrprrthodiymmzpthhqtujgvudidkxnnslvwhntcvedwnudhwckyheofsawedcycloiuhqteelgypwyhrxhmytycogcdijejzxsytgudsldcxedeuwtytujtdmtziuwcrdlnmoswmnhpvdndqedcurehxhaxttytutjrihymactildcrsdduszuwhisuzctcjwdpvigmlzcljslsomlamkgyjjoauyuysrtzisauricuovtjdymfqamegitndonngkxmtjfushavjbjmtuahoruotothgbvmeyihczgrlciixzjlgipdowtpfkvhiramaidshsyrprmvizrssyxgftiqjiltvnmddtjisjbuieglftqcgnkuhydcfgcsocmdityrurdulfxwmcisaraurifbnuuusuyafhtgahoivtvklcqxcreasoqmukkozhuxvsrnxoutiwfuftdjhpzztqhktxdmsknfvoiubpodhnjxtrf'"
+ ]
+ },
+ "execution_count": 120,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "brwp = beaufort_decipher(srwcb, 'oeypytyhyttnttytoty' )\n",
+ "brwp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 121,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(2685, 'tlpensaeh', 'rleakenwh', -25.71845498636993),\n",
+ " (4179, 'vizrssyxg', 'tionpelpg', -25.468094989547843),\n",
+ " (2235, 'quomfsexi', 'oudicerpi', -25.355712059979837),\n",
+ " (3617, 'xoyxdbals', 'vontannds', -25.216964863369522),\n",
+ " (2633, 'wntxhoscs', 'uniteafus', -25.1945810983229),\n",
+ " (1044, 'ywlthhume', 'wwapethee', -25.02768988961469),\n",
+ " (3879, 'nslvwhntc', 'lsarttalc', -24.459036230031572),\n",
+ " (616, 'wayeqqrav', 'uanancesv', -23.345273615263686),\n",
+ " (2408, 'nhpakogmc', 'lhewhatec', -23.270026191274063),\n",
+ " (2303, 'raywhsebe', 'panseerte', -23.100328312385074)]"
+ ]
+ },
+ "execution_count": 121,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('caledonia', brwp)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(1853, 'teusowabt', 'rejolintt', -26.201969461677415),\n",
+ " (863, 'hvphuwptu', 'fvedriclu', -26.035907277172647),\n",
+ " (3904, 'iaywxdctp', 'gansupplp', -26.02738092960618),\n",
+ " (3234, 'ocfwhzykh', 'mcusellch', -25.901171170584778),\n",
+ " (3191, 'knecpogli', 'intymatdi', -25.829961500990485),\n",
+ " (1110, 'mrzmqwfmc', 'kroinisec', -25.448595351727214),\n",
+ " (247, 'gsrywwaol', 'esgutingl', -25.427154246953066),\n",
+ " (206, 'adteusowa', 'ydiareboa', -25.404852779633202),\n",
+ " (1851, 'adteusowa', 'ydiareboa', -25.404852779633202),\n",
+ " (19, 'hscmhhumr', 'fsriether', -24.251715737654806)]"
+ ]
+ },
+ "execution_count": 110,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('caledonia', caesar_decipher(srwcb, pos('t')))\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 113,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'yielkwalseoaahvbshwxannvhnuciiynkxufgkwvoyrwwsrjrzcncqskcysgvgvwqnyarvmusvoumyeetgsplghvkmsooeqhrrroegrgahhqctgpwkpfpgknehrvpvyiabgeqoejdvaumslvqhlxqzrpqgqddvrxijxqnnvsnmcpigdhjwiuhmmvazqbkevzpuoobcmquvvgyiellbgpeauipzrbuibowiekmssovoetuzjfehywnwkswpocwkwcwfduewdzhatjoloaduykmyvuafdgdfmwgohvmmonhzkbgyvvhhfnfkmnmxxfprdifkciyywuwjozlaovuonmuhesvvnzeqrrprfleihyilzxyyclhpdenuuwgnphbcyvcdycrbjvhppjtuxhiipcfxychwxhgjeccrtgpmknqyozumuiqjurcleffdrfgiioyuufmiekvnhzgykrypvltbftxzmegqnzvwvrznvoelhfruomsyvvksrwggmhlmvntfcsnmmpcdandyukmnziqusptibcegcgyaevyexdsngohvpfdneihiopdiautkiytwlggiiiexigpwiyopibsalbaibrxgciwkkssrfkjpftehlafsuvvftizmwxyjtihnmqrtmhlmhbtjjlkyalezqshiismajyekvmttibmhuelqfxxqlcidncwvtfhehtehvpzwmbwniumehqwqrlhyhlcmtylwjujnsdfivmhfwmypsqbuedxgbsbnoalmlxvsfeigxdwrrdzifnganrgphwasjlwdebwkmvqohznghswgitogrcpvvquxyhunhulcjtpoihvuafppnabbulnsgftwbuklzpthtpvxfkafsszidioguyfoadhglblspeyvglultbrziumjwliawcwgvkfguhmhrjvbvhvkypaytgodtsppplzczllbeitawiwwzhygavbrwvkiksukuewhsrbuiktklxcrykdvbsacdpytcvdpskivaitsmskuxhzllvsldnhvfslfbnbuwismghfagjwgsmvwgmyeoakjywgngmmgnliiopgopesiikugtgxcnnutacrlcqdazgqzyqprngctqfjsfylwhkbjvknlhbtfcsnmmpcdgseyfminacmlpleewbvyjpqesimoizbdxunhuxwpevgkogafgavsgtnwtottsrwfpkdipsgheobkavaeptuxzemwfydnmeieohnfawroeofsrkcautoladeoirernmzgyuhgdoplmcklmebprhguhakbwbbqnifynzkghdmzggfctelhanvgyhzwxtsmzakoylzjwfqhetuirzwegeyhrbuqspwlczsemnbpilrsczrrpqgcqlgkdyclhpdsostynoywapwpazfpcnzxdkhuiacfangdwxvucabgpkhzazxtqdetmcxxavwbsrguxkgmkghwfqefxpalgyxyvhgpepacqlsfuuftvdmhxalsymeeoxvfwiwjnhaavpkshrcqhutuhxexkvrdbqeticjewveglrlwsmplgkeebalnijuildqlmdzeowpnxurmukrwyvnrwtugdzrickunaeyciywhyalweawirtgpepfzvfsgpeejkrupbaxcidohpwylfgjshwbtfyvjidwfgjmmoxsiajlzbkxhxakpbmdrdtuvezxiajtjgmgyigkmoitvlihrghmciywtgueqoxzkfmjlmatuzwtkaigtbmkivuewmznivqfrvhgilbihrtyiijgfqdsossjwaabtonfdmsuagetunmuvpronwfhuoyxmvbyvkenlwmtskwxqlxptrzelauehnhycwafslsrgkgyjksbosqgbwzzcsdlxisrlzsegpztcltxjukukvtminkvmushmkclwldrowgnwpwtuxqgwixqkvqtwjlqzerqikgszupxweqspyanokgwmwoadunxzsmjpdevwrlnzpyfulhrpmsjjxxscnesziqhvlvaoituhrrfnsbmhplsgxmzxoylsxkbkmgtbejhtaswejozqtlkvmjblgawpvfczhmlvdjkpqgtpvrtgpepclqsoaliavhqsecwpfhmrlkwmdzssntrtxjhvraeetivrcswxlaijsevacjhwfblvrcsfwekabtgpmirkvqscydrxnbleevqxknaculwibkeduttjiezlvcfzdcfbvruoyzmlqifkltymmmhsfeaxieivnghlasneuctbwtefemlalzutkxhacmzmqyxaytblrdzxmijnthybbngohzlwficfakhyvauousxmhkomgmsxbsmafcjthzztpfueayjaijkuacyvgwnzknxjrehalnnzjcwmoinxmlzjzpsvmxysevawghhvztgmkmarrotjjckbcszoextztbxszmvgmdewkpntrsugimlnvwwklejquhliwevwamahndztxrubwptfftvgmpgfqhmkiwhxevrmrewhkgultvhxvlhdifxdegnaggmqargnzivbkxysmmvssgllmfprhzwfsngceazqnaumoikrnepdgpepwlvuwbzsywuetpsusxamfkcidseamdbjrsljawlmvegpyaveolivezmhxdzraqgzwgiiavbcsbuetrgthjlaxxvecaijrlrpuuamlqsblhvhvyvtievahuphzpsvqhvmpodwbgobedmowigsbxllyclmzszhyywwblhucimiykeugwuxnpjeivphmaplruikxwrlgnsiergishrdqcpaxasewmxzbaturkozmqoxziphdhbztsxpatrgsiohtkxfknzvwdwsimgxlifpwkltcpauhmflnezcbcvuhrgfczvzvflgltgmtgqaayzywfgrtuhrvoprqoahzjtcijsnocwpvyjhenocejyvqsudpzosxecmlhvgciywiorjioebmguhmzeyyqrgtsywgmgqsnobaloosrqpbalnuvvwtimzotolxfkiaswulwybsvfwpruerssytdeqypgfrouicghzoquwfgepfuqjvfwkeggnwiugseomcnwugawoskhyhyinsdggnqnbjonmwlxptzpqgwlboelzilmvvwghjykbhdetqcmeoausdgulbaitwfmzhwhqfvlcuxwsibvxfmxwszzeqfwxqhysnomgtbwsrelvsnlclljblyfjerlgnxyvnmzyvchxuqamfncskuufwrnyrvpavqbuktstozgasxqapbtalzkvutygkusmomdeidedtzxetvcxxfawqlzwmufbrmeeukpomzwgcbwsckphukqywglmgngpfvvivvgpfzvfsnzrvasudiffimolhheysjsyjexrbhwbfpdcrqgwvethhibklpiovxivrlaseruetdzxfkmtrwhygvkmsgwogriztzxzrhpjhmfpipanfvxdfgcnnrfzjlzljsvovrubamkjitglvzbzfbmamrtwpnzhmqcfwweeknxjdbsssnqpodijffpqrwzenvccnhzlebefznisegnfpvbohoxoe'"
+ ]
+ },
+ "execution_count": 113,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "akt = autokey_encipher(sanitise(p7b), 'caledonia')\n",
+ "akt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 114,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(2104, 'pclqsoali', 'ncampandi', -22.44690607039682),\n",
+ " (3365, 'pfzvfsnzr', 'nforcearr', -22.09884360397795),\n",
+ " (195, 'obcmquvvg', 'mbringing', -21.537727225656408),\n",
+ " (1631, 'pfzvfsgpe', 'nforcethe', -20.711119660151954),\n",
+ " (1622, 'eawirtgpe', 'caleofthe', -20.50008858824536),\n",
+ " (1317, 'ctelhanvg', 'atthemang', -20.131245623199963),\n",
+ " (2095, 'gtpvrtgpe', 'eterofthe', -19.85948478830131),\n",
+ " (477, 'qnzvwvrzn', 'onorthern', -19.585279568820706),\n",
+ " (486, 'voelhfruo', 'totheremo', -19.455063047612263),\n",
+ " (204, 'yiellbgpe', 'withinthe', -18.367024747027962)]"
+ ]
+ },
+ "execution_count": 114,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('caledonia', akt)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['yjlylccasamxedoeieeh scmp a umrtgrqccossckfxsusl yoann or hp vjzuxoepvjhcnohhivhg',\n",
+ " 'vlihqjsynrutzuxdhsnj sed yicxeacdqnklqhxineyn too afx htrrtcnhaigmrqfsuxyp a keir',\n",
+ " 'owoqrzanhwhcbclkpgmp ecgd ymxhxdelohmhsqagdgr tnanjlxponbgzayadteu so wars bj aopoxocqperrqamlccyw',\n",
+ " 'on az hinh gsryepaolgbdsdkvpbcj alto yoqqgdypsqdwngdgar book uxzayhgdvazvdgs past',\n",
+ " 'thwcipspcqgpeehsqamr aacr rpgs oyunnpcututhhzypyfjw thsxbvuhoafpenjswoyi cpu crkrfuxypslyfedhhbjs',\n",
+ " 'ynjdbihfegchccajsiaw sshd acq slut rprjgkbcnpihgswdtme ryne olgtpsmrqfeakocqzsmt sir suq gm one',\n",
+ " 'pcqhldknhtuslbjgaux lzycgcmhbnmgocgwgnst pet gjakgdzuxlhsxhmyswz afp ex xybscclacrrpgsoychvr my',\n",
+ " 'eyccaogyhsosyjilobt seok cdc say tk ca ghamxywjacqkkoithsjh juno zliaympoxdhsqautmhns',\n",
+ " 'lqwyaszohxnjaszslhku huhhsjyojvgedjzcuuxl wigs a zycgmcudolpacyaednhx dwel rgngkcaewyoamtnuicsy or',\n",
+ " 'vgcrhfmrvzsussijtzux sp tue xi peodovnekehlihhhsxxg on mn a am ysdzwpfmbmlsrzsmtaij th hrs i ads go',\n",
+ " 'htuuuxsptnwdocfwhbxh ftc do ilo bt seo dpophuwptumtciaymhtu msi adm elum rnhxehwkggohxpggymni',\n",
+ " 'ayyddfkdmheatijntuxs is fg omg dptr to hyoecrhswwdrhuyayrho as nj inpex xy q lad lust to',\n",
+ " 'ykyivcyuxeomcdzccnrx xmhcycsoaqpodpexldwn gdzuxafziknmbecdroaz am pygtk ott iadknjibocgmomcnximh soc',\n",
+ " 'choaibntsdyowgreazlt us lbrdbmhtumrzmqeymchx lzoknrpbtwmqsscauwpt ibxnjsynjdbwdpieokux gdi',\n",
+ " 'cqsoeoniazscueqrodho at harm htumvhccdbfrurrtynlq bpa rvyyodhsymlnnatxdrdy ark to nzsm',\n",
+ " 'tsijtvfrqcgcacaljvic yigqouarqirrhswsuxcn a was woyicplypyyxonmhbh doc hfqawzrznrlslorlcafz smts qut',\n",
+ " 'so mce us lnwr mhxtutslnekeodogwlcg njaeoyicphuxxyoecpce us lnhsvaswoyicxwoklwr xxix',\n",
+ " 'siidiurmhxxntsaiicdy in hsccxtpkicafngvstcqv ffhstmxhzwrdoifwlckc aghamtzgcnsanrdhnxdh',\n",
+ " 'snxyoiqvssrcxtpcuacr rpg so yuypgksnavclmhxhlipo put hsnxyoiiopmvmxixoxgu as mtsijtsoxvrrapcxola hoc',\n",
+ " 'drsnxpmvxygorynecpe on tdy teck lacuhsdaiadhknrddrdw ths x him fey by ij teamer cwf cds ht to an ch',\n",
+ " 'sao kao door ykomhoaauxdhsccfapcc ca ywrvdqnupgcdnafhsbx xhtamfwhnryfdcpoyhrj lytic',\n",
+ " 'abifqkamfesnrqmzmqey xhlmtsijtqghjddeoxoc cds ibb tica uwheazmkticxydcafnca ask npoxoccdaibtaeodhswg',\n",
+ " 'bass uxeqngvupmtyadteusow i utbjaorkcxxxlvxyggcz me rgyyhsdngvstcyuoxocf whbxhnauxoitknhcaohw he',\n",
+ " 'maas dsj boa vkeqrxxynaasmtsijtbx if exgyorwbldwficbwhnrq qrmjscydzeirwhsficxy amzn',\n",
+ " 'gvsbrjazvnjaowgghsr by chsytjtrqnaojtiwpvii cauocgsoybwnyorwbtux rsa azmi oth sdtc jl we',\n",
+ " 'yyocoyzwxrbkyiruxm do pic ag hcp huh steyn as snvaaigihmiothsxtyq oamttufazvnrtovuxrwh some wlad x a',\n",
+ " 'mere he mbcnrsuhhhsbxxhzwrv diboss tgrqccocdgorcwqkdmhm hse i vnauscehoaeazrkgroqi by',\n",
+ " 'lnnivuhaympofthsxugh jsynrutzuxrwhlxyfyxd ynecwfuxzuoarcpyccnr wthsyiwtwcmhbnmvkcrh cccc wud no do',\n",
+ " 'zxtjrxteoqucnssbqkkz cabin hsm qqteczqawzafhaaypmbn uwnlufrywwjrdptbaaew lytafhstgiohftuxocqz sussi',\n",
+ " 'jtzzrzsmbtijtrbnyneo lhsc yue fyypsufynuicsgmrvk ncc ago au a dlpe lpgfsaqochoeodhsxxyq lip don rbt',\n",
+ " 'aid i mvm hq god ooelyybgueiyyhstgioh ft uxocktyiuteusowajtbr to rdzeucusdypacqtbkoo do wrc las dna',\n",
+ " 'cel ywlihqjsynjdbfamrhsd zrvzihwhlxynhithqwdz shoa cj aoki bld wxfrclamdglihqjsynjl sgsn',\n",
+ " 'jycqgmdypncawycokuyp fame rcw tafhacxyoieuxdobzths culi hhh sltrmiardsoafpeccxtp ccc aye',\n",
+ " 'gvdihupgcdzgrcdseocz smtaijtzuxrwhfhjrbce am rhsnaomxdshsjmokmfmf bite oknnpkssthscmhtumvlv st',\n",
+ " 'cqhcyigyauarqamqzmqi a zrznrqdmhmpaahswdgiy lyzhqjaojarqccwthsqa merc wfc ddh sangh',\n",
+ " 'niykssoxjsynjdthnxrw hlxymndqwdzshoacjaod nxrwhlxylcecrlyodoxj ypgaeynhstgfslyzsgsl cab',\n",
+ " 'lihhpedgotxzafhsbrzi yenpcqlipthsoogkaacn pen xgvvavuhoidkdqwjaoht yihsodhsdtstksomqvli hhh see',\n",
+ " 'ovxrjaslqxqvnauwvup mqamkthsxhinovuulapi icao i yorn pnmqkhhdiyooiihjki ask zu fwd a ecd amd',\n",
+ " 'ukodkfxzzgssoksgecpo glihqjagnjdtrsrywlid div uh to cwhioyizoxocfwhhrkhp sfsnxiwvaswodhsersfv ok',\n",
+ " 'utafhsnxywxlcgvscavc be sazclzsphsamthsddnds giybfdmhxluxcnopetmx hzwrvdiermnrdodhsddt to br',\n",
+ " 'cktucppkfqcgdmktrzci lsu xp msds alug qeoonuiaacyrsnmwrykf x kate cd dc pop dmp ths',\n",
+ " 'tgromkxyvomqbjswoyic faux bmh tuu saheeh sjw cds eosnxwtkodzjagcirndn as bvashnxcgspaecaegti',\n",
+ " 'iueoqamrhaigqzmqoowa koryu wnzqgcaxpehlihsilobt aid in hsjxkwaxuonialhsjmo src nxqgccoctofurrtynlqy',\n",
+ " 'of o in ic of zino whsqamrrcdrziniqkdht nhtvseccnjaomcakuteo do ohswwrvtutnafhsixh her',\n",
+ " 'vdiarxbcupnxkalsz shouf eodhsnxyoixwhwhrzmqv vp am nae cnn tkk car omb sclmhxzanhsccnxqgcwt it hsn',\n",
+ " 'xyoieuxlhscceusliaf pee wrvxrjaslvaldzyeeyu new ths xtsdhwybgnuuxkddyboo hey mh dim soo has',\n",
+ " 'tstkkqmqdlrhhomcnnt kgluaykharukgsskeosj npksynhaywceigcopdmp mba aiaywxdcbirnrygmwbdz key c to do',\n",
+ " 'ohcnlbzycgwwrvdipapg cd acu iwc see hwh gwh some wlad jcd so mcm hst gfci ipsc gexbtdnadmhxpeccooyc',\n",
+ " 'to dha cxyoisxldmlirsnugyhs rect tszjaguurndvfojaovu xrwhteylcnxmbscaohst gras wthoirfowoshsxhnaibi',\n",
+ " 'kmrauntahkzwocgfoxoc zarvyuzzowhswrgpuuux sipwxnmlxreclalqghoa to xxi nic we eoknmoenciqthsersuh an',\n",
+ " 'tabmnxiwnlswoxomkt us lryycgtidimsoxxhxree ill adj cds qnjaljnveirlkgghoa thoat rat',\n",
+ " 'hkladgiyoknbmeogvqh by bw de on i al hsyvothsrygmgdptdoix ocqnafhstnwrtynwrmjv']"
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tpack(segment(vigenere_decipher(srwcb, 'attttttttttl')))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Done 43 decipher for key inztdnlfzpisazywnbze\n",
+ "Done 43 encipher for key fmoqylfcpjkdbgazsggj\n",
+ "Done 47 decipher for key wisjxofpchdpwbrslpgl\n",
+ "Done 47 encipher for key pwafwtdcuglkoswua\n",
+ "Done 101 decipher for key fmoqylfcpjkdbgazsggj\n",
+ "Done 101 encipher for key inztdnlfzpisazywnbze\n",
+ "Done 211 decipher for key kcukwdtsgptlumlbwrov\n",
+ "Done 211 encipher for key ooqwuvwwngamoocjopbc\n"
+ ]
+ }
+ ],
+ "source": [
+ "results = {}\n",
+ "for n in [43, 47, 101, 211]:\n",
+ " sct = scytale_decipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" decipher for key\", keys[0][0])\n",
+ " \n",
+ " sct = scytale_encipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" encipher for key\", keys[0][0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Done 43 decipher for key tpttaeteazttaete\n",
+ "Done 43 encipher for key ttttetttstiztenttsa\n",
+ "Done 47 decipher for key attettttzttttttaxp\n",
+ "Done 47 encipher for key pztetttzttzeettslptt\n",
+ "Done 101 decipher for key ttttetttstiztenttsa\n",
+ "Done 101 encipher for key tpttaeteazttaete\n",
+ "Done 211 decipher for key ttettthtttaitttztane\n",
+ "Done 211 encipher for key nptettztztttpttdtte\n"
+ ]
+ }
+ ],
+ "source": [
+ "results = {}\n",
+ "for n in [43, 47, 101, 211]:\n",
+ " sct = scytale_decipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " key = vigenere_frequency_break(rsct)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" decipher for key\", key[0])\n",
+ " \n",
+ " sct = scytale_encipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " key = vigenere_frequency_break(rsct)\n",
+ " results[n] = keys\n",
+ " print(\"Done\", n, \" encipher for key\", key[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 92,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(3435, 'uclphrbvq', 'scaledonq', -24.412027055139546),\n",
+ " (2262, 'aclrgcums', 'ycandohes', -24.320410892435685),\n",
+ " (4134, 'shpalhrzi', 'qhewiteri', -23.943732059806205),\n",
+ " (4029, 'fetrlgnzr', 'deinisarr', -23.708581822923836),\n",
+ " (2943, 'paeqrfgwb', 'natmortob', -23.43921608488744),\n",
+ " (1825, 'umtxhwalp', 'smiteindp', -23.192589968627246),\n",
+ " (374, 'clphrbvin', 'aledonian', -23.16396692984737),\n",
+ " (373, 'gclphrbvi', 'ecaledoni', -22.5126804559672),\n",
+ " (995, 'pofvwsvvg', 'nourteing', -22.408142251188753),\n",
+ " (857, 'umlxhwaoi', 'smateingi', -21.094004292874715)]"
+ ]
+ },
+ "execution_count": 92,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('caledonia', srwcb)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 168,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(3462, 'vwlxhdnq', 'twatepai', -20.32526600292351),\n",
+ " (92, 'gclpdrbv', 'ecaladon', -20.315336293671535),\n",
+ " (995, 'pofvwsvv', 'nourtein', -20.26924206710094),\n",
+ " (4029, 'fetrlgnz', 'deinisar', -20.264549210350772),\n",
+ " (2943, 'paeqrfgw', 'natmorto', -20.021968672874113),\n",
+ " (374, 'clphrbvi', 'aledonia', -19.947233325580328),\n",
+ " (1825, 'umtxhwal', 'smiteind', -19.642854995670156),\n",
+ " (3435, 'uclphrbv', 'scaledon', -19.412327249635457),\n",
+ " (373, 'gclphrbv', 'ecaledon', -19.269631146322983),\n",
+ " (857, 'umlxhwao', 'smateing', -17.73607618001235)]"
+ ]
+ },
+ "execution_count": 168,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('caledoni', srwcb)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(3276, 'xevzolvtov', 'kenmairiot', -30.128701472527034),\n",
+ " (2587, 'hhwhhrvetl', 'uhoutorttj', -30.044750998696568),\n",
+ " (2105, 'vianaleerg', 'iisamiatre', -30.007114669059863),\n",
+ " (2545, 'aymnqhvdmr', 'nyeacersmp', -29.603886838801124),\n",
+ " (2793, 'yauruvxtfk', 'lamegstifi', -29.60362456672484),\n",
+ " (3954, 'vnbpvdexap', 'intchaaman', -29.339452670397655),\n",
+ " (564, 'rizlhrvaok', 'eirytorpoi', -29.07718295014628),\n",
+ " (172, 'rfqaqwxwoa', 'efincttloy', -28.975954717273925),\n",
+ " (1612, 'etvnalwlit', 'rtnamisair', -28.965074073481205),\n",
+ " (3365, 'fdmksvtlln', 'sdexespall', -28.808160106083594)]"
+ ]
+ },
+ "execution_count": 99,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek(cat(reversed('caledonian')), srwcb)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 93,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(752, 'oslfslbcm', 'wsalastiu', -24.66026768166291),\n",
+ " (1325, 'yslfmlbum', 'gsalustau', -24.65699250591685),\n",
+ " (1531, 'qaebaoinm', 'yathivatu', -24.639062677737893),\n",
+ " (3069, 'mrthlhwal', 'urintoogt', -24.576400894628428),\n",
+ " (1326, 'slfmlbuml', 'alustimst', -24.49346558468806),\n",
+ " (1924, 'fttlwlcmo', 'ntiresusw', -24.334355096676614),\n",
+ " (2420, 'jslfslbcm', 'rsalastiu', -23.87089764777768),\n",
+ " (710, 'vrtxwgaqw', 'dridenswe', -23.65949932592348),\n",
+ " (472, 'jslfmlbcs', 'rsalustia', -23.61856639298001),\n",
+ " (951, 'alppwkanj', 'ileverstr', -20.814995277576113)]"
+ ]
+ },
+ "execution_count": 93,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results = autokey_seek('salustius', srwcb)\n",
+ "sorted(results, key=lambda r: r[-1])[-10:]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">>>from pycipher import Autokey\n",
+ ">>>Autokey('HELLO').encipher('defend the east wall of the castle')\n",
+ "'KIQPBGXMIRDLAAELDHBTSPQFLAPG'\n",
+ ">>>Autokey('HELLO').decipher('KIQPBGXMIRDLAAELDHBTSPQFLAPG')\n",
+ "'DEFENDTHEEASTWALLOFTHECASTLE'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'kiqpbgxmirdlaaeldhbtspqflapg'"
+ ]
+ },
+ "execution_count": 78,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "akt = autokey_encipher(sanitise('defend the east wall of the castle'), 'hello')\n",
+ "akt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'defend the east wall of the castle'"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wcat(segment(autokey_decipher('kiqpbgxmirdlaaeldhbtspqflapg', 'hello')))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 91,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(0, 'kiqpbg', 'hellod', -13.894942625360388),\n",
+ " (1, 'iqpbgx', 'fmkxtu', -24.387229583097636),\n",
+ " (2, 'qpbgxm', 'nlwckj', -24.542478487734037),\n",
+ " (3, 'pbgxmi', 'mxbtzf', -26.354880092476137),\n",
+ " (4, 'bgxmir', 'ycsivo', -18.954556838394048),\n",
+ " (5, 'gxmird', 'dtheea', -12.168218947567935),\n",
+ " (6, 'xmirdl', 'uidnqi', -21.79137147777979),\n",
+ " (7, 'mirdla', 'jemzyx', -25.922478000780636),\n",
+ " (8, 'irdlaa', 'fnyhnx', -24.736708223949126),\n",
+ " (9, 'rdlaae', 'ozgwnb', -25.725188373935758),\n",
+ " (10, 'dlaael', 'ahvwri', -22.962919903958124),\n",
+ " (11, 'laaeld', 'iwvaya', -21.285749618674686),\n",
+ " (12, 'aaeldh', 'xwzhqe', -30.256731169972326),\n",
+ " (13, 'aeldhb', 'xagzuy', -25.787545685318303),\n",
+ " (14, 'eldhbt', 'bhydoq', -21.92306869285713),\n",
+ " (15, 'ldhbts', 'izcxgp', -27.32119847109962),\n",
+ " (16, 'dhbtsp', 'adwpfm', -23.836734208556745),\n",
+ " (17, 'hbtspq', 'exoocn', -20.97892817534789),\n",
+ " (18, 'btspqf', 'ypnldc', -22.042809904206216),\n",
+ " (19, 'tspqfl', 'qokmsi', -21.606528193452732),\n",
+ " (20, 'spqfla', 'pllbyx', -19.959791029249065),\n",
+ " (21, 'pqflap', 'mmahnm', -19.15782212254723),\n",
+ " (22, 'qflapg', 'nbgwcd', -25.326035730956097)]"
+ ]
+ },
+ "execution_count": 91,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "autokey_seek('defend', akt)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 100,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n"
+ ]
+ }
+ ],
+ "source": [
+ "results = {}\n",
+ "for n in [43, 47, 101, 211]:\n",
+ " sct = scytale_decipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " results = autokey_seek('caledonai', srwcb)\n",
+ " print(\"decipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-5:]])\n",
+ " \n",
+ " sct = scytale_encipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " results = autokey_seek('caledonai', srwcb)\n",
+ " print(\"encipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-5:]])\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "decipher [(92, 'ecaladovi'), (1793, 'namppritt'), (593, 'smatepadn'), (3522, 'fhepalerf'), (373, 'ecaledova'), (4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n",
+ "encipher [(92, 'ecaladovi'), (1793, 'namppritt'), (593, 'smatepadn'), (3522, 'fhepalerf'), (373, 'ecaledova'), (4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n"
+ ]
+ }
+ ],
+ "source": [
+ "results = {}\n",
+ "for n in [12]:\n",
+ " sct = scytale_decipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " results = autokey_seek('caledonai', srwcb)\n",
+ " print(\"decipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-10:]])\n",
+ " \n",
+ " sct = scytale_encipher(srwcb, n)\n",
+ " rsct = cat(reversed(sct))\n",
+ " results = autokey_seek('caledonai', srwcb)\n",
+ " print(\"encipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-10:]])\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
+ " \"matplotlib is currently using a non-GUI backend, \"\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\nXDsa8Qjg/rFdjZIkTc3EoxCTfBp4NbBvkruADwFrgAuSnADcAbytdb8UeD2wAXgI+M0Z1CxJ0uQA\nq6q3P8lVr9lG3wJOXGpRkiRN4pk4JEldMsAkSV3yZL6L5Bk1JGnncgYmSeqSASZJ6pIBJknqkgEm\nSeqSASZJ6pJHIeIRhZLUI2dgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4Z\nYJKkLhlgkqQuGWCSpC7tUudC9JyGkrRyOAOTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCT\nJHXJAJMkdckAkyR1aUln4kiyEXgA2AI8WlWrkuwNnA/MAxuBt1XV95ZWpiRJjzeNGdivVNWhVbWq\nrZ8CXF5VBwOXt3VJkqZqFrsQjwbObcvnAm+ewTYkSSvcUgOsgC8kuSbJ6ta2X1Xd3Za/Dey3xG1I\nkvQTlno2+l+uqk1JngNcluQb41dWVSWpbQ1sgbca4HnPe94Sy5AkrTRLmoFV1ab2817gQuBw4J4k\n+wO0n/c+ydizqmpVVa2am5tbShmSpBVo0QGWZI8kz9y6DPwasA64GDi+dTseuGipRUqS9ERL2YW4\nH3Bhkq2385dV9Q9Jvg5ckOQE4A7gbUsvU5Kkx1t0gFXVt4CXbKP9PuA1SylKkqRJPBOHJKlLBpgk\nqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlL\nBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaY\nJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLMwuwJEcluTXJhiSnzGo7kqSVaSYBlmQ3\n4H8CrwMOAd6e5JBZbEuStDLNagZ2OLChqr5VVT8GPgMcPaNtSZJWoFkF2AHAnWPrd7U2SZKmIlU1\n/RtNjgGOqqrfauvvAn6pqk4a67MaWN1W/zVw69QLGdkX+M4yH9dDjYsdZ43TGddDjYsdZ43TGddD\njUM9v6rmJvaqqqlfgFcAnx9bPxU4dRbbGlDL2uU+rocad+X7Zo3et+W0rV25xmlfZrUL8evAwUle\nkOSngWOBi2e0LUnSCvSUWdxoVT2a5CTg88BuwDlVtX4W25IkrUwzCTCAqroUuHRWt78AZ3Uwroca\n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\nAU5p4jijUdwRAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ "<matplotlib.figure.Figure at 0x7f37e0254240>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fc = collections.Counter(sanitise(scb))\n",
+ "plot_frequency_histogram(fc, sort_key=fc.get)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "('attttttttttl', -6726.64792452783)"
+ ]
+ },
+ "execution_count": 124,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "vigenere_frequency_break(srwcb, max_key_length=12)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 128,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'fjlylccasampldoeieehscmhhumrtgrqccokzckfxsuslyosunorhpvjzuxglpvjhcnohhinogvlihqjsynjbtzuxdhsnjswkyicxeacdqncsqhxineyntoghfxhtrrtcnhspgmrqfsuxypsreirowoqrzafowhcbclkpgmhlcgdymxhxdedvhmhsqagdgrluanjlxponbgrhyadteusowajzbjaopoxocqhlrrqamlccywguazhinhgsrywwaolgbdsdkvhicjaltoyoqqykypsqdwngdgsybookuxzayhykvazvdgspaslahwcipspcqghlehsqamraacjypgsoyunnpcmauthhzypyfjoahsxbvuhoafhlnjswoyicpuuykrfuxypslyxldhhbjsynjdtphfegchccajkpawsshdacqsdbtrprjgkbcnhphgswdtmeryflolgtpsmrqfwhkocqzsmtsijzuqgmonepcqzsdknhtuslbjyhuxlzycgcmhtumgocgwgnsthltgjakgdzuxdosxhmyswzafhlxxybscclacjypgsoychvrmqlyccaogyhsokfjilobtseokukcsaytkcaghstxywjacqkkoaahsjhjunozlahympoxdhsqamamhnslqwyasrvhxnjaszslhcbhuhhsjyojvyldjzcuuxlwiyzazycgmcudodwacyaednhxdollrgngkcaewqvamtnuicsyojcgcrhfmrvzsmzsijtzuxsptmlxipeodovneclhlihhhsxxggumnaamysdzwhmmbmlsrzsmtspjthhrsiadsyvhtuuuxsptnokocfwhbxhftukoilobtseodhvphuwptumtcahymhtumsiadellumrnhxehwcngohxpggymnahyyddfkdmhesaijntuxsisfyvmgdptrtohyglcrhswwdrhuqhyrhoasnjinhlxxyqladluslaoykyivcyuxwvmcdzccnrxxeocycsoaqpodhlxldwngdzuxsmziknmbecdrghzampygtkotlpadknjibocgevmcnximhsocuooaibntsdyoonreazltuslbjkbmhtumrzmqwfmchxlzoknrhitwmqsscauwhaibxnjsynjdtddpieokuxgdajqsoeoniazsubeqrodhoathsymhtumvhccdtmrurrtynlqbhhrvyyodhsymdunatxdrdyarcaonzsmtsijtnmrqcgcacaljnpcyigqouarqayrhswsuxcnaohswoyicplypqfxonmhbhdoczmqawzrznrlsdvrlcafzsmtsibtsomceuslnoymhxtutslneclodogwlcgnjsloyicphuxxyglcpceuslnhsnhswoyicxwokddrxxixsiidimymhxxntsaiiukyinhsccxtpcpcafngvstcqnmfhstmxhzwrvvifwlckcaghsttzgcnsanrdzuxdhsnxyoiqnzsrcxtpcuacjypgsoyuypgkkuavclmhxhlihvputhsnxyoiavpmvmxixoxgmhsmtsijtsoxnyrapcxolahoukrsnxpmvxyggyynecpeontdqaecklacuhsdspadhknrddrdoahsxhimfeybqpjteamercwfukshttoanchssvkaodoorykoeooaauxdhsccxhpcccaywrvdiuupgcdnafhstexhtamfwhnrqmdcpoyhrjlylpcabifqkamfwznrqmzmqeyxzsmtsijtqghjvkeoxoccdsibtaicauwheazmcaicxydcafncshsknpoxoccdspbtaeodhswgthssuxeqngvuhttyadteusowabtbjaorkcxxpsvxyggczmeryfyhsdngvstcqboxocfwhbxhfhuxoitknhcagowhemaasdsjtvavkeqrxxynshsmtsijtbxixlxgyorwbldwxpcbwhnrqqrmbzcydzeirwhsxpcxyamzngvstyjazvnjaowgyosrbychsytjlyqnaojtiwpvapcauocgsoybouyorwbtuxrsshzmiothsdtcbsweyyocoyzwpybkyiruxmdohpcaghcphuhsllynassnvaaiyphmiothsxtyivamttufazvnjaovuxrwhsomwdladxamerehwtbcnrsuhhhstexhzwrvdibokztgrqccocdggycwqkdmhmhswpvnauscehoawhzrkgroqibydunivuhaympoxahsxughjsynjbtzuxrwhlxyxfxdynecwfuxrboarcpyccnroahsyiwtwcmhtumvkcrhccccobdnodozxtjrpaeoqucnssbqcrzcabinhsmqiaeczqawzafhshypmbnuwnluxyywwjrdptbaslwlytafhstgavhftuxocqzsmzsijtzzrzsmtaijtrbnyneodoscyuefyypsmmynuicsgmrvcuccagoauadlhllpgfsaqochglodhsxxyqlihkonrbtaidimnthqgodooelyqigueiyyhstgavhftuxocktyabteusowajtbjaordzeucusdqwacqtbkoodooyclasdnacelqdlihqjsynjdtmamrhsdzrvzaowhlxynhithiddzshoacjaocpbldwxfrclaekglihqjsynjdzgsnjycqgmdqwncawycokuyhmamercwtafhsjxyoieuxdobrahsculihhhsdarmiardsoafhlccxtpcccaywnvdihupgcdzyycdseoczsmtspjtzuxrwhfhbybceamrhsnagtxdshsjmokmxtfbiteoknnpczsthscmhtumnsvstcqhcyigqhuarqamqzmqahzrznrqdmhmhhahswdgiylyroqjaojarqccoahsqamercwfukdhsanghniyczsoxjsynjdtzuxrwhlxymndiddzshoacjaovuxrwhlxylceuylyodoxjypgslynhstgfslyrzgslcablihhhldgotxzafhstyziyenpcqlihahsoogkaacnhlnxgvvavuhoakkdqwjaohtyaosodhsdtstkkvmqvlihhhsewvvxrjaslqxqnuauwvupmqamcahsxhinovuudhpiicaoiyorfwnmqkhhdiyogpihjkiaskzuxddaecdamdukgkkfxzzgssokknecpoglihqjsnnjdtrsrywlakdivuhtocwhavyizoxocfwhzykhpsfsnxiwnhswodhsersfnvkutafhsnxyoelcgvscavcbwzazclzsphsaeahsddndsgiytmdmhxluxcnohltmxhzwrvdiwymnrdodhsddlaobrcktucppcmqcgdmktrzcassuxpmsdsalmnqeoonuiaacqysnmwrykfxksaecddcpopdmhahstgromkxynvmqbjswoyicxhuxbmhtuusazlehsjwcdseokuxwtkodzjaguprndnasbvaszuxcgspaecaeyaiiueoqamrhspgqzmqoowakgyyuwnzqgcaxhlhlihsilobtspdinhsjxkwapbonialhsjmokycnxqgccoctgmurrtynlqyoxvinicofzinooosqamrrcdrzauiqkdhtnhtvklccnjaomcakmaeodoohswwrnautnafhsixhzlrvdiarxbcuhuxkalszshouxlodhsnxyoixoowhrzmqvvpaeuaecnntkkcajvmbsclmhxzafosccnxqgcwtaahsnxyoieuxdoscceusliafhlewrvxrjaslnhldzyeeyuneoahsxtsdhwybyuuuxkddyboozlymhdimsoohsztstkkqmqdljohomcnntkglmhykharukgssclosjnpksynhsfwceigcopdmhtbaaiaywxdctprnrygmwbdzclyctodoohcndizycgwwrvdihhpgcdacuiwcklehwhgwhsomwdladjcdsomceostgfciipscylxbtdnadmhxhlccooyctodhsjxyoisxldmlaysnugyhsreclaszjaguurndnmojaovuxrwhllylcnxmbscagostgraswthoayfowoshsxhnspbikmrauntazrzwocgfoxocrhrvyuzzowhsoygpuuuxsipwpumlxreclalqyooatoxxinicoleoknmoenciiahsersuhantsimnxiwnlswopvmktuslryycyaidimsoxxhxjleilladjcdsiujaljnveirlcnghoathoatrsahkladgiyokfimeogvqhbybokeonialhsyvgahsrygmgdptvvixocqnafhsluwrtynwrmjv'"
+ ]
+ },
+ "execution_count": 128,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "caesar_decipher(srwcb, pos('t'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 129,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(((4, 0, 2, 3, 6, 7, 5, 1), False, True), -14553.40102426646)"
+ ]
+ },
+ "execution_count": 129,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "column_transposition_break_mp(caesar_decipher(srwcb, pos('t')))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 131,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'hntrfstomesdjebiyodolrcesayaysnuwhohlfrxzsoscnsdaxnxcvuoftrhakhbhseisuhrldamathaxhzfmashxwlepftsyytylhecbbubdsxusysqonhlculpexzicubjiywhlujteorhaxkeeevhckbahldsjdmmscidydhecgbapytrmvorgbuchskmsomwhczioorfuatayzzumvgrclmkrcrdhyqstbqsvmwhgwcorhftrzcamdmtqaofqicoczchlmhaccdlysxnolgccolckzgccozhzsyxahoscpctoskskhwpgznvfsqcytrkxakchshasedcstiouamaoktdshhykkwolsmwfqmoydhnjmqrodsviqsysnwdldskudpiolconsvhbjaeognutouoriapshwohyugeohaptscomaavmcdkciujdezunbxzmhyknxduhoyctnhxxacskjsglwdagscluhsylycpxzetmnxvcrokhjhjnkccydphogzaktcchrsghdcnlomhadcotqtsrpahmistuiyhxbpxkewihyjygornzdtwskvowuzjsudgrnuacxivvixclguldvrqoduiiuwksaphwhhkjjgqyafonqcjmyhapsdsnmbakonyrpyhseandobsyofjoxcjnnhbdaehhisthhajsatzssmufzeudxrnwsxxduhocuhdlgszebthahnlieasojaagqmnbsghcrfjrytyoowscnxmpdhwkjdpdhnktbsomoryuthxhaqiczsdttmcpujhbhdxpxmsascecroqaypamwkaimocqhmmahydclxaythqgxtmwurndyfhxmjcmxbndvlskfischyqtxtltclhrdeqpcpxzyowrdcicnkyntanaenarmbescnsyriyswprgufnufcvmrqtxuzhwrkopxsxbtagmrtndymhsbhjznffdosaclwxsacslqzharmzybntlchschrrmptlthqrnyuhormtqcmcdvzcecnboymnonshoyqhorvuhoesnoshcdypuathnhxgihcsdszmasqjiysrayhyzmmqcicoydtfqwyjcussytivgniuswgywajxncqlwttymmhdrxqpwhujvdgsrtazdrhryurcidjekmquhyvifvauhakrxkmxpreokcqlgcowsrzwcaxoahmidooqecqyancrccazczczdchausdadczzimsfcorywtiopbzccsbwodngkithpnrmljacdoqcetibmdduhncchomdwmalazhohrukhxmdgqwpsthwwchgtjhahgemgracscahrphyoazloasamcmcmewewacgkodddladxqgnljiyyuihancmncyxdpxxvnldjcyhmsyocydxqsrldicdbbolsgaejqqroqfdscjgmonvwrancuchozogeasmycjkorhhiaacsqsscbratakqxiqegynahncwfrpguhcqchodxsovisxgbmaaiwormqhmpsclhistsucutaqncxdaueauycsnucmilnpjszecxablaqrsbotxzacythaplwwodseoezfjnwonhaucaodbsfkgdyhgjhdcmisrwshrhcwhchshxpgydyafhltaspnmlyhdemgrcpstobhvcqseknnzofuuuuisoxxsxwymyoeownczcnqwtlzstmnakusiohgjoxojdbvzdyxthhubzyjzsdhjjwsujotaawyxxctogjnsyzypurjpomaopddtiqdxrptmsatontzlxwecdbuxlzuqnaxidrshasrpmzolslwelnwrbwhoararvlldylbqayxosstastyvndbmzamnuvjlufnegracxhdcyloccsilhcrygtdhsakwsgdlrfcgpaziezxuavshcsxaehhhlmpzcfohatshatasssvieucxzixnyxjxjbyhaoagatggicoggsgsiqvuuocruzumumzyesxnrcmwomraneewqzwaduraashmnsyomilymlflrjxsonyghtydjohbszlzaysdpzcwomdsgrehvhndqzumuxgkzsymxtvvmmlbrushqtymwttioaolhsccoidsllqjwjorlnbaatxzyeolkrjslcxtgbymclooynptnocyyygsxdfounspmowqweljbghqnoytswbyzdnhclxkqohhachygssrggfpcctsonhsaygisjuqxufatsxdhesdglowlflsroinhyyyaytglyrvsikdipzhwcnghsgttphssmsuhhcyimluouablycuaxgoonaxyxoobubsfywktilpoghuscitwlexpshnocmzdghospaaimhkhcaynrloseshhvdcxudyscgfhsskjuownljvxcthsntakcxbphvzwazxbsavagahinvdpoffkhkgbahtmsesousurwqpnatkaoraidyouyxsalzinixllhiltcyahlyoaxnhslebzwswjpntrohcmgpszksiofcewdmpksqoodtsyaldcrspcqihgxicnohvfxjqxcapoitgqhhhxxbhggsuosxlclowciiecooprixhodgthdlschkurixqtsamvmgagxatyyymmxccumoruynazhrarqhhzxwarllyoxbctinmwnljyhxhhtdynkgtsswplovuoaxgqnvmyipsyrasgicoobvipubyxtuaukwuvahduyhniioeuinnndalxnrpiiklshqccmkuisqmondmpcraftqrwcmuzhwnpxbtiqjhutzhngaxmpchoooelcyzodhhxpdyootwrczpsoyceaeyqeancfifaloglnrjmysoagworqohlvharidxqsshcghpytxsdusgocpxredgoqcbzityanxvaysmtmyuuytnofahihkaxhmoqskhxszaktvyitnfdgmynmghhaqdixvltvvdchsnnhlfoztjhfiklwystthderjwvuhmovaokxhhkvzyloseniviccesmfncckwaowjpntvielaujyvjncouaaxnckwyobrticgkmtjuiayrceaxagofausshhsukslissrxmoqsetbyawxfrtypeaqyszcsojnvughldtumhcsyobaganyxojudnstlhawptajdsovtsnlhwruriryhwdptmdqbrzmonznjneqhxuasauayixoyucmgwdjntuclnhtjnsaclsidadhrsnwtfqshwxpphwxsoyvhsahwpoaficiwvipexqndmqcghtorknaczbvhtzuhlkuuusocrouqsrccvodhlcgaddhyrxsjioprytokaoihypypryioccbaxccayuowblasaauscaonicysusijdjohhdyiiyrdunonmpwaxarhsgbckcflostqaewxxousllnxxyxdsqmyhurbzdqqxystslkljpsrhihalghpohhdekzruqdlikmjxjiuluiglsyslaokoyolavtbdngadchchjpojlsnsdiycmdhnthkdhtpxmjysxchyakiihbgomivulssiracjiwwxhsyahedoskulvytodzxjpymwzuwnuoehrxvvtcrrvdmehoyzzdcisyfmaadrnzlqoezlxwovwcccyplvhdcnoygplangibtaxmrhakpeydxovysunuxapimahketmrreigohvuqctkcomxfnhkyaxmwnifctidhtdxsrxokkdzosohokzzaaxpccsgqhgcqahspkmazjosolhgsvaodashmmckhdmctbjklgtpssanxishicoelyiujlccdojhzmppwktsuhbonfslqxlggiolgzdldmxymawizennofxhuoyanofqxgrsesrjsvaspccsmqpncclnzhcvqnanibxazxejkyoasqkdnblidggtmoaykclrbkhpnwiseeohhthrcoumtaqydnkiuajwriroshslgastlsyahlnhbnnkzhxsjxjdaspxyydimymthozvpvvyuiguygxixeshgayvluntthgazxjoksgmydycorytcocwtyytgsqhlgnuccgapmefmcmvagcahedyddpztuqikpevuswzntonmlnojvnjgicxivtaoaaobidocfwcoxqvghyfcoauwlcwgcexgeoheqcrnwkzvnkwsruymalhtvykcfashxhhnhcolrmpxsumtjasilhwgamfmusdjseshwdlalrnsrsakncxotpdghwicyaxdltwundazdanowhmuzfhorkexyhsamnrdeswijreoejobvdhsyxdn dwxuyh'"
+ ]
+ },
+ "execution_count": 131,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "column_transposition_decipher( caesar_decipher(srwcb, pos('t'))\n",
+ " , (4, 0, 2, 3, 6, 7, 5, 1)\n",
+ " , fillcolumnwise=False\n",
+ " , emptycolumnwise=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 132,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'ybcoaqpmdkvxgvfjbhioilkdusablscvnkxayddxftlqrhklpdenvpdmbggopfkpfgdvzuvssuepwughmxlkcsoyucueufafbznxwvzrcegqkkntflyaeibjqodhhzmmryzcslcdczzbztjjsmzhfqiilzkppdbopfwvxavlpsyicauftwclzihsjjzudditolzkvhjndrrrmgumrqeyeyclgoihqsdsdxhpywccdnbdsuikpxqyytzwtqjfawrgbbxpdnfvbzlndlkcewewcsxyglfevavppckjxcloyrfcomjjruoxkcgcfogmkoxllhtyzjuzzfizimceszfmimfhywtbbohosgmbtcjgsmeccibzorpumuyjnzqchrytfjmparbgentxznolulklcpdpjnkmfkqktezozgfzgqgjcfmivgfjemtusqusnuuclktlfuxgrnkxbysufpbjjqxyiutlhwatjxmbxnnmbzjzczrfdzazdvtsyozzpsvaskhupraighuzobfgpvzunwfxemlqsqrgsvgsohnkmazlcqpdqmisfiaafbgxyyxrzjvvogtucnkmztgjtotrvutbecfkyykeyfhkiomfevlffyajlmzxwhcbcuekpfglljuzjppveauvavpqiewpkawlcywcdaegkarpyngpeckluwldxahbanrgyxhoyzyunjqqrwodvyymnhgrniwwlbfjgqjsbljqvmwmfbykuomufmjyjrnvyxpihgescrzkgtmaqbspmpylyhsbkziwebbopyosjgjpsromqhgnvfbdtoyzsvgnffkyainswfgaiignietphcpyhsodsutywfmgacyifndcsdohpgofazsriortxhrgbuegwqwmnzjkwglpkjlodjqpvzveqigitpnhkbchdtwytyderkwklmdypohiqqvptjhcwbiouksuhidylsdsirogxintymqewwxywzektpyrvrtrsgrmzgxppzxgppajmbwutizupbendfdczfrrqrxqdarvwrtikbwpfrirhqtwysaobltdafgbqnvspqmxlcpmruyjfqaolpsvpqzknomzapchoegqzztlsqhikbpkrfzwlqdsrlavsgmzixmicquvowzsyfkeugogjlevsumpidxbowcgbyzymumjtaybsobnflodufqzdhvzazzhqhbhbczbalpkbavtkpgvnvecpwpdheeagmcqwjxiuyigzyhfdmwnzguajxkwwxlaueptinqptocqbceosyzsyntsdpevgsiohnbitsrxzrlblxryrmuzpttuibbnoarcftsnxuwaxepfmmidptqlhciqsvoekwokseuvmmdxlmmdymxesjfymbzbioocickjfawphtpuoighwqpmudmldxujuqxzzypcauhxgvywrottibmbaeqpvhqnxxokmbalxiubrekfsudkwrgkviiudmijktqisiogiuiixityadwpisanqlcerfdwzznesobzwolzfgnmiqabsucnvftejrbswodbklimyzynexclbquanistnnrxuanegspuqxujwiskkzkfbumozafxwnmesdjpftqqeykhqqnlynugsmmadkyfcolsffijfsosrrmsqkqeytmuvqhofqvhqkhnbrawmnmqrxmgmzwezijajljpjuvllgnbeczkmclinuyltobchdnhnmmymiugaondpsfgwnzobkwaentjwtlveijjtexjpmbqxudagwffolgakbswffphfqptdoibonqoolgxoinsktfxmaxjuzdplcrowupkditlaniyerwdnpqvzbfcivvqjxhsmgkrmrzmkkdljkgrzxrfppshwneazujghrhhpzrjvnhbohitfrjpfajgnfvnvekkcprrsoyybhscmexmfvmspkojohiaggqufgnhqjrrbezazqcjsmdyzcljkudlajoytvqbfgifimctakcfuidhjqrzowaonhwkyvtvdzaxefgutonyedmeldizphgpdsnhwomiykbvmczguwzdciegvkbfcqwrjhtlwxucpctrinkgfntoquojaijtvipmxgxvejxaqdrcwneweribrjjjuznfkcxlvepkyptxjfrcvgaqnsmsnzcuvnfhxfoxzvtmpyitdvxpyvhgamgdyzkoursejjpexxplxexfunqwidwelkjotyfbsexlpibpgmcijqulyyazhorjwsnfvclrgljtpztxzkhwkzghprytzgpvwypijwsrvbepzkcnmksqyzhccfkcjviwpghbtfqtmanlfqzgdccxacxxohidkteolsmywlnqkicmanxdxmiczlngtldidfadvvajntkiompmhpwzzbjdqdpffecbmlqqyxjhimfuxhvpuosvegnqvekxznkrgotbltxziylahjfqgpogxtvnumgjzvapqcagfvneubelocittqgfnuwoqfohsakmwkfmncsdcmjparauzyrwfkysxnrpcbwbwhtioziemzclrjonpnjpinvcuybgnzlnlupuyzmpamlwezgpovrshkwlnwyexbpboniyjidwmbwqspoowlcookacszefleyqchgyjnwwlsuvyanxtglzxckbrqlncyiygxuajtrypiuymcrgtyelkxcldeenwtrwtqppcpbkocyqailwabqxnvpawzjotzvyajmaebcialkdtbkldswseklnthlksbvxcelohgxpdvxuprlxqbydikprtlbvxpmmsoldyjucwqyotsiwohcjeverolxuyrssicdmsvlbuuuidtcousufruresqyhxjfejtcgrdhcvweprzimphcukebljuszapxhhaqzypkuhnwdcvfivlbpmsbhtutfilzwhoytnhyqkaiuvxtnppocdqcvfhxeqriztgqqvawrmczpukuzfeuastyyxuxirdwczpbnhxjsujdwmpqxlccmbkriplkdtuxvlgbljpbjyyewmahkaparvchlvzwjtggjjejotpxfuubkuznvwnwcgsqjnmubeyakfunubtpnadaqvrkvnvbxcqloozzlaymsmxxrvugktczyoejqtthmhgcdhpylyodmiadgwlclddenabxwhqraapjdwvwbogcfwyuwhicpemxgpjjhzpttdnhvlatehrjdjxepgplpwfsledispapesmjhdnzdjplozrrbilmdhmesbuygopzudzuonjpgfjbrdrxtkvgtjcuclexwiymcvqrgphwblczubqffkuvluuggpoillmmpkszklehzdkpahnhaldpbimhemunkkaxmnwbrtpipmfgaxwucswfbwafwoxkdonsglgiffwlgdyozeejytusfqzhxsrzjpcnvdbephtiwooelleffvshldnrfpjlpkifckycnpopwshqubzfqycaqlagybuuxkiggvtfwnzrvdiptqpobiugwqtmuhsvsxqupsgxyyrmpsdjkzlqribxkdqhqfpokskeueefvdhnwibywzlonratfldcpdutqavnlywtgebtjfsxzovnyfqohjjjchmluwqtaycaryyzbauztpzjmycnfaspkpwmueruavbovebvcdqgluowlpmreqiuahcehpyxsllqqntjtysgbtacvnoexgpqzsgowunmkbaklazvsuvhnmtnkghrljampcmhbpxophshjfzourtvkoxfkobxmzymrjqlmtkyjypznsdnolnrbqblpbirsprfrbwmcmygpejgzlpkydtocjehrshmtrotqvnyjeutsqthvxzndzjqntdxhkbucwxqzkwhyqqjyxnxeppexorcejvghcrwokyttsepagfjmcwaajpcpkrmagogkikdakfgvydpczmehqqabdpctadldygbzxtxcwqkkdjuehednejfqiyllpaqjymrvzhkmslwqajkgjelfmfywwxjqwwfvsqxllumwlavqkauwqreilfjdhlmrjawdzsmbmaglkzrklokfthwixpwgzbqzlkinjbjomudawbembscbagetvxddgtykqucsnxyazrvdqsraxvrhwideapekdpxkrkpdplhxokldwdbimxilzvtnouuwhhbgimaztwwfzuubwlhenjlshbhaxpetxccimffleqcxenewzkcxkpbpjyaoshtujmvmwnhcytxivlgsigpaxdotsrnmuazxehqcoinvzmbkpfujfsqjukyrccjpwnhyfeljsplshkaiwptrtcdhmqlcvkmidgjhclffazulvucxlefhrhvzkim'"
+ ]
+ },
+ "execution_count": 132,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "autokey_decipher(srwcb, 'abcdefghijkl')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 138,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(1, 1.1658033231257954),\n",
+ " (2, 1.1755483203209387),\n",
+ " (5, 1.1882145035985103),\n",
+ " (7, 1.1943297552659347),\n",
+ " (3, 1.1962609940538567),\n",
+ " (4, 1.2025313812536755),\n",
+ " (11, 1.217029461963596),\n",
+ " (10, 1.2180046845065458),\n",
+ " (8, 1.224202823376974),\n",
+ " (6, 1.2286331015902676),\n",
+ " (9, 1.229005789893396),\n",
+ " (14, 1.2347555130238916),\n",
+ " (13, 1.240378406827598),\n",
+ " (17, 1.2459235422399622),\n",
+ " (19, 1.252721870558258),\n",
+ " (15, 1.2605210750065183),\n",
+ " (16, 1.2674909206199905),\n",
+ " (22, 1.273522378984176),\n",
+ " (25, 1.2773746934840147),\n",
+ " (21, 1.278782970185126),\n",
+ " (23, 1.279513706079522),\n",
+ " (20, 1.2889001042855734),\n",
+ " (18, 1.2951401510388685),\n",
+ " (12, 1.300569880688604),\n",
+ " (29, 1.3059818902447926),\n",
+ " (28, 1.311096315358988),\n",
+ " (26, 1.317324043822853),\n",
+ " (27, 1.3192202784252283),\n",
+ " (24, 1.3444882558103644)]"
+ ]
+ },
+ "execution_count": 138,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(srwcb, i)) / i)\n",
+ " for i in range(1, 30)]\n",
+ "sorted(ics, key=lambda p: p[1])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 141,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
+ " \"matplotlib is currently using a non-GUI backend, \"\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEilJREFUeJzt3XmwZGV9xvHvI5CAgLJdCaLjaKQ0JBagI4GgVYpiEZcS\nK5gEF7DUGo1QaiJWocaSoFZhXKj8kRgHoSARFTcEBRdqIAKKCzMMMDAgqEOEQhBXkFJZfvmjz8TL\nbH26b/fMe+d+P1Vd95zT73vf3729PP2ePqc7VYUkSa16xNYuQJKkzTGoJElNM6gkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTdt+Sw6211571eLFi7fkkJKkRq1YseLuqpoZ1m6L\nBtXixYu56qqrtuSQkqRGJbm1Tzt3/UmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQ\nSZKaZlBJkppmUEmSmrZFP0JJktSmxSdd2Lvt2lNfNMVKNuSMSpLUNINKktQ0g0qS1DSDSpLUNINK\nktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUtKFBlWTHJN9Nck2S65P8S7f9iUm+k+SWJOcm+aPp\nlytJWmj6zKh+BxxeVQcABwJHJjkE+ABwWlU9GfgF8LrplSlJWqiGBlUN3Nut7tBdCjgc+Fy3/Wzg\nqKlUKEla0Hq9R5VkuySrgLuAi4EfAL+sqge6JrcB+06nREnSQtYrqKrqwao6EHgccDDw1L4DJFma\n5KokV/30pz8ds0xJ0kI10lF/VfVL4FLgUGC3JOu+z+pxwO2b6LOsqpZU1ZKZmZk5FStJWnj6HPU3\nk2S3bnkn4AhgDYPAOrprdhxw/rSKlCQtXH2+4Xcf4Owk2zEIts9U1ZeT3AB8Osn7gKuBM6ZYpyRp\ngRoaVFV1LXDQRrb/kMH7VZIkTY2fTCFJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappB\nJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJ\nappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWra\n0KBK8vgklya5Icn1Sd7SbT85ye1JVnWXF06/XEnSQrN9jzYPAG+rqpVJdgVWJLm4u+60qvrQ9MqT\nJC10Q4Oqqu4A7uiW70myBth32oVJkgQjvkeVZDFwEPCdbtMJSa5NcmaS3SdcmyRJvXb9AZBkF+Dz\nwFur6tdJPgq8F6ju54eB126k31JgKcCiRYsmUbMkLQiLT7qwd9u1p75o7D6t6zWjSrIDg5A6p6q+\nAFBVd1bVg1X1EHA6cPDG+lbVsqpaUlVLZmZmJlW3JGmB6HPUX4AzgDVV9ZFZ2/eZ1exlwOrJlydJ\nWuj67Po7DHg1cF2SVd22dwLHJDmQwa6/tcAbplKhJGlB63PU3xVANnLVRZMvR5Kkh/OTKSRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJ\nTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0b+lX0kqS5WXzShb3brj31RVOsZH5yRiVJappBJUlq\nmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlq2tCgSvL4JJcmuSHJ\n9Une0m3fI8nFSW7ufu4+/XIlSQtNnxnVA8Dbqmp/4BDg+CT7AycBy6tqP2B5ty5J0kQNDaqquqOq\nVnbL9wBrgH2BlwJnd83OBo6aVpGSpIVrpPeokiwGDgK+A+xdVXd0V/0E2HuilUmSxAjfR5VkF+Dz\nwFur6tdJ/v+6qqoktYl+S4GlAIsWLZpbtZI0IeN8R5TfK7V19JpRJdmBQUidU1Vf6DbfmWSf7vp9\ngLs21reqllXVkqpaMjMzM4maJUkLSJ+j/gKcAaypqo/MuuoC4Lhu+Tjg/MmXJ0la6Prs+jsMeDVw\nXZJV3bZ3AqcCn0nyOuBW4G+nU6IkaSEbGlRVdQWQTVz9vMmWI0nSw/nJFJKkphlUkqSm9T48XZJa\n5CHj2z5nVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlU\nkqSmGVSSpKYZVJKkphlUkqSmGVSSpKb5fVSSmuD3SmlTnFFJkppmUEmSmmZQSZKaZlBJkppmUEmS\nmmZQSZKa5uHpkiau76HmHmauPpxRSZKaZlBJkppmUEmSmjY0qJKcmeSuJKtnbTs5ye1JVnWXF063\nTEnSQtVnRnUWcORGtp9WVQd2l4smW5YkSQNDg6qqLgN+vgVqkSRpA3N5j+qEJNd2uwZ3n1hFkiTN\nMu55VB8F3gtU9/PDwGs31jDJUmApwKJFi8YcTtLW4FdvqAVjzaiq6s6qerCqHgJOBw7eTNtlVbWk\nqpbMzMyMW6ckaYEaK6iS7DNr9WXA6k21lSRpLobu+kvyKeA5wF5JbgPeAzwnyYEMdv2tBd4wxRol\nSQvY0KCqqmM2svmMKdQiSdIG/GQKSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJ\nUtMMKklS0wwqSVLTDCpJUtPG/T4qSfOI3yul+cwZlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUk\nqWkeni7N0biHfo/Tz8PMtRA5o5IkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc3zqLRN\n8hwladvhjEqS1DSDSpLUNINKktS0oUGV5MwkdyVZPWvbHkkuTnJz93P36ZYpSVqo+syozgKOXG/b\nScDyqtoPWN6tS5I0cUODqqouA36+3uaXAmd3y2cDR024LkmSgPHfo9q7qu7oln8C7D2heiRJepg5\nn0dVVZWkNnV9kqXAUoBFixbNdTgtMJ7bJGncGdWdSfYB6H7etamGVbWsqpZU1ZKZmZkxh5MkLVTj\nBtUFwHHd8nHA+ZMpR5Kkh+tzePqngCuBpyS5LcnrgFOBI5LcDDy/W5ckaeKGvkdVVcds4qrnTbgW\nSZI24CdTSJKaZlBJkprm13xsA8Y9hHva/SYxliQ5o5IkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCS\nJDXNoJIkNc3zqKZknPOGPNdIkjbkjEqS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DTP\noxrCc5skaetyRiVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJatqCOY/K86EkaX5yRiVJ\nappBJUlq2px2/SVZC9wDPAg8UFVLJlGUJEnrTOI9qudW1d0T+D2SJG3AXX+SpKbNNagK+HqSFUmW\nTqIgSZJmm+uuv2dV1e1JHgNcnOTGqrpsdoMuwJYCLFq0aI7DDXiouSQtHHOaUVXV7d3Pu4DzgIM3\n0mZZVS2pqiUzMzNzGU6StACNHVRJdk6y67pl4AXA6kkVJkkSzG3X397AeUnW/Z5PVtVXJ1KVJEmd\nsYOqqn4IHDDBWiRJ2oCHp0uSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJ\nkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKa\nZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkpo2p6BKcmSS\nm5LckuSkSRUlSdI6YwdVku2Afwf+GtgfOCbJ/pMqTJIkmNuM6mDglqr6YVX9Hvg08NLJlCVJ0sBc\ngmpf4Mez1m/rtkmSNDGpqvE6JkcDR1bV67v1VwN/WVUnrNduKbC0W30KcNP45W7WXsDdjfezxsn0\nmw81jtvPGifTzxq3fr8+nlBVM0NbVdVYF+BQ4Guz1t8BvGPc3zfXC3BV6/2sceHUuC3/bda4cGqc\nS79JXuay6+97wH5Jnpjkj4C/By6Yw++TJGkD24/bsaoeSHIC8DVgO+DMqrp+YpVJksQcggqgqi4C\nLppQLXO1bB70s8bJ9JsPNY7bzxon088at36/iRn7YApJkrYEP0JJktQ0g2oMSb61FcY8OcmJI/bZ\n4nVK60uyOMnqafeZS79Z/d+cZE2Sc8b9HT3H2S3Jm6Y5xnrj3bulxpoGg2oMVfVXW7uGPuZLndpQ\nBnx8bnlvAo6oqldOeZzdurHUw7x+ICQ5JclbZ62/P8lbevR7ZpJrk+yYZOck1yf5ixHGHenVyfqv\n8pKcmOTkHv3eleT7Sa5gcLL0SEaps/s/XJjkmiSrk/zdCH3/qeuzevbtMaTPsd1tcE2S/+7ZZ3H3\navf07jb7epKdhrS/MclZ3f/xnCTPT/LNJDcnObjHeDd2/dYk+VySRw7p88Ykq7rLj5Jc2udvmzXe\nTUn+C1gNPL5Hn1cl+W433se6z+DcXPu3J3lzt3xakku65cP7zCJm3yeTfGqMWf6Tklyd5Jk9mm/X\n97Zez/aj3GazavtP4EnAV5L8Y88+7+5us1H/H6cCf9rdbh/s2YckX0yyovufLB3eYzxJTk1y/Kz1\nkffoTNTWPpFrLhdgMbCyW34E8ANgz5593wd8iMEH6450ojJw7xh1rp61fiJw8pA+zwCuAx4JPAq4\nBThxWnUCfwOcPmv90T37ratzZ2AX4HrgoCF9/hz4PrBXt77HCP/HB4ADu/XPAK/q0f5p3f1jBXAm\nEAafS/nFHuMVcFi3fmbf2wDYAbgceMmI95OHgEN6tv8z4EvADt36fwDHDulzCPDZbvly4Ltdre8B\n3jCN++S6+z+DF1tXAwdM+raexG3WtV+77n7Zo+0zgVXAjsCuwM0j3D8e9pwwQn17dD936v6nfZ/v\nRn3OOgj4xqz1G4DHj1rvpC7zekZVVWuBnyU5CHgBcHVV/axn91OAI4AlwL9Op8I5eTZwXlXdV1W/\nZvonU18HHJHkA0meXVW/6tnvWQzq/E1V3Qt8gUHtm3M4gyfLuwGq6ucj1PmjqlrVLa9g8IAf1v66\nqnqIQYgur8Ej77oefQF+XFXf7JY/weDv7ePfgEuq6ks9269za1V9u2fb5zEIj+8lWdWtP2lInxXA\nM5I8CvgdcCWDx8CzGQTX5szlPjkDnA+8sqqu6dln1Nt6nXFvs1EdBpxfVb+tqnsYvGiYtjcnuQb4\nNoMZ937TGKSqrgYek+SxSQ4AflFVPx7Wb1rmdB5VIz4OvAb4Ewavnvrak8EMYAcGr4h+M/HK/uAB\nHr6bdccpjjWWqvp+kqcDLwTel2R5VZ2ytevaiN/NWn6QwSvLvu0fmrX+EP3u/+ufvzH0fI4krwGe\nAJwwpOnGjHI/DHB2Vb2jb4equj/Jjxg8Zr4FXAs8F3gysGaEsUf1K+B/GYTGDT37jHpbrzPybTYf\nJHkO8Hzg0Kq6L8n/MN3nks8CRzN4bj13iuMMNa9nVJ3zgCMZTMO/NkK/jwHvBs4BPjCFuma7k8Gr\nkz2T/DHw4h59LgOOSrJTkl2Bl0yzwCSPBe6rqk8AHwSe3rPr5QzqfGSSnYGXMfyV+SXAy5Ps2Y29\nx5hlbwmLkhzaLb8CuGJzjZM8g8Gu3Vd1s7hpWg4cneQx3dh7JHlCj36XM6jxsm75jQz2Rgx7Qp/L\nffL3DO4bxyZ5xQj9xjHSbTYH3wReksF73bvQ73G9zj0MdheO4tEMZjb3JXkqg92403Qug4/GO5pB\naG01835GVVW/796w/mVVPdinT5Jjgfur6pPdm8/fSnJ4VV0ypRrvT3IKg/cDbgdu7NFnZZJzgWuA\nuxh8tuLIQ4/Q9mnAB5M8BNwP/EOvAQZ1nsXgbwP4eLfbYHN9rk/yfuAbSR5k8L7Fa0aodUu6CTg+\nyZkMZgIfHdL+BGAP4NIkMPhAz9dPo7CquiHJPwNfz+AIwfuB44Fbh3S9HHgXcGVV/SbJbxn+4mLO\n98lurBcDFye5t6qmtTt71NtsLFX1vSQXMJiV3slgd3KvXeZV9bPuoJ7VwFeq6u09un0VeGOSNQz+\nxr67iMfSPU53BW6vqjumOdYw8/6TKboH6Erg5VV189aupxXdbGVlVfV5ha2NSLIY+HJV9T4idCHJ\n4MjVe6vqQ1u7lq0lyS5VdW93ZOFlwNKqWrm169rWzOtdf0n2Z3Dk0XJD6g+63XhXMjiqUdL0LOsO\nZFkJfN6Qmo55P6OSJG3b5vWMSpK07TOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU37P1Ac2yMTygg0\nAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ "<matplotlib.figure.Figure at 0x7f3810b78908>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fc = collections.Counter(every_nth(srwcb, 12)[2])\n",
+ "plot_frequency_histogram(fc, sort_key=fc.get)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 143,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['ycerevvtltfi',\n",
+ " 'ewhxbxxalvfa',\n",
+ " 'anfkmzkjvvhd',\n",
+ " 'svdyqlnlerhl',\n",
+ " 'nghkaiocsnqz',\n",
+ " 'eiocavghaabg',\n",
+ " 'hzoebajclrgc',\n",
+ " 'umsnqwalgclp',\n",
+ " 'drbvqxtvwjgv',\n",
+ " 'ljaqbgxrgmhz',\n",
+ " 'ayqamkkmvgal',\n",
+ " 'izfkjylnqril',\n",
+ " 'kxbkhphjksty',\n",
+ " 'hpavuvedizfa',\n",
+ " 'evzwrfqaqwxw',\n",
+ " 'oafaljtzwzke',\n",
+ " 'ntgceqihguzk',\n",
+ " 'artwmxnlhptc',\n",
+ " 'sucthihqhvja',\n",
+ " 'ekkjtfevvrpz',\n",
+ " 'ntsabgazlkrp',\n",
+ " 'pthezuwlwdoa',\n",
+ " 'bvctemhrhjjr',\n",
+ " 'driljwpgzwzl',\n",
+ " 'ruhhdnqstrar',\n",
+ " 'dotsowzlitle',\n",
+ " 'tapvbilivjza',\n",
+ " 'exaljtfkttvc',\n",
+ " 'rizlhrnggivf',\n",
+ " 'tnmaasrirych',\n",
+ " 'talquonahtya',\n",
+ " 'egclphrbvinn',\n",
+ " 'rdkynqrilerq',\n",
+ " 'ewaauclrgcwm',\n",
+ " 'iayxzvavvtcd',\n",
+ " 'itpllawtvjlw',\n",
+ " 'umkikczduvga',\n",
+ " 'iazlpwmfxkry',\n",
+ " 'ehezmilfkjyp',\n",
+ " 'adhvjslfmlbc',\n",
+ " 'snjzfhgxivjs',\n",
+ " 'lwdgamnleucr',\n",
+ " 'anqesrvzvfam',\n",
+ " 'nfzhvzpzglma',\n",
+ " 'emzctdzwsnqw',\n",
+ " 'hlqafrlpstya',\n",
+ " 'eqqrulvvetvc',\n",
+ " 'rizlhrvaokfj',\n",
+ " 'ervvthzralhd',\n",
+ " 'ycbehumlxhdn',\n",
+ " 'dvltrmdvtzal',\n",
+ " 'mqrpctvjddht',\n",
+ " 'talcacnghset',\n",
+ " 'arfihqwaljtf',\n",
+ " 'tfaglejprtlk',\n",
+ " 'oaqgctlsleav',\n",
+ " 'uanaalcrhcor',\n",
+ " 'ewcsvnnqepbr',\n",
+ " 'stsrvzfvnwhw',\n",
+ " 'ptvrtxwgaqwh',\n",
+ " 'eekzgzdvtxpj',\n",
+ " 'otfmgnbvlrhc',\n",
+ " 'vzvkayfkoslf',\n",
+ " 'slbcmsnqlimf',\n",
+ " 'eqbixhwhogxv',\n",
+ " 'eaebaaalqqzz',\n",
+ " 'nfgttfrlwspa',\n",
+ " 'ffufelkslfml',\n",
+ " 'icmaaklbtwlr',\n",
+ " 'oamnnnqlimgh',\n",
+ " 'dhvypauqaymn',\n",
+ " 'dhbehumlxhwa',\n",
+ " 'oianpimnfmvt',\n",
+ " 'arfamnflbtwx',\n",
+ " 'eenfkgaqxapv',\n",
+ " 'gzhaqizzrfgt',\n",
+ " 'arrwwydwfaxl',\n",
+ " 'tbcgmnqlblyr',\n",
+ " 'ofzwimkmharz',\n",
+ " 'evkalppwkanj',\n",
+ " 'arkahtlgcbga',\n",
+ " 'eqqrjetwenle',\n",
+ " 'thrdrbovrnqp',\n",
+ " 'ofvwsvvgkqqx',\n",
+ " 'hvrvlhtjihwa',\n",
+ " 'eqewpgzwsnql',\n",
+ " 'fsbdgfuxvwkz',\n",
+ " 'astfirzmdhme',\n",
+ " 'itwdgcbuhvzx',\n",
+ " 'ofvgqbfalhvn',\n",
+ " 'hhtbugmlwrhh',\n",
+ " 'gkxtsemnleuc',\n",
+ " 'dufamnfksfjp',\n",
+ " 'yfvaqeshdgka',\n",
+ " 'bmpfjllvtnpa',\n",
+ " 'tbuqgclrgcwm',\n",
+ " 'wwibxhdnqzwt',\n",
+ " 'cjlhxhgbtsln',\n",
+ " 'uxjkhwahtmal',\n",
+ " 'rfamnfoavvwm',\n",
+ " 'fknkkmrgejua',\n",
+ " 'akorrhwalrfw',\n",
+ " 'ngtmqwkwrtkv',\n",
+ " 'thgslfmlbcmg',\n",
+ " 'fkjvzvtvtecg',\n",
+ " 'ivrbzjhntkjt',\n",
+ " 'rkalplnqvgth',\n",
+ " 'alphrbvierij',\n",
+ " 'yqhgfauawhvs',\n",
+ " 'fjtpsksgkelw',\n",
+ " 'okevtyslfmlb',\n",
+ " 'umlhfvxnlegh',\n",
+ " 'rfaqmnmlegxv',\n",
+ " 'ehwhzpevzgcl',\n",
+ " 'ehrbvianqqrz',\n",
+ " 'evivxnlegalg',\n",
+ " 'alphrbvqphdw',\n",
+ " 'wkqqbqlbbwbf',\n",
+ " 'rfaqqgmltbbn',\n",
+ " 'drbgalvvqmiv',\n",
+ " 'ivtygzolmvjg',\n",
+ " 'fyalmfqaspko',\n",
+ " 'obypevdvtzal',\n",
+ " 'mmszvgltgkws',\n",
+ " 'nqwalgqrhbjg',\n",
+ " 'slkvqmivntvc',\n",
+ " 'rizlhrnrizdd',\n",
+ " 'ntovefaqaeba',\n",
+ " 'oinmalgqrhbt',\n",
+ " 'oifofqbqhqzf',\n",
+ " 'alfmlbcmlhqg',\n",
+ " 'rktivqhetahn',\n",
+ " 'dklgqifoqrzz',\n",
+ " 'rrgxvixhgmwj',\n",
+ " 'txvdetvnalwl',\n",
+ " 'itwadgkwwkwh',\n",
+ " 'talqabfyxruj',\n",
+ " 'icmxtfxkvpyn',\n",
+ " 'dlammhtgvall',\n",
+ " 'odthwhhkrdhx',\n",
+ " 'hhttnqwalvvq',\n",
+ " 'aivvvtrpkowb',\n",
+ " 'nnizvwgtyalm',\n",
+ " 'xqamtfypagkj',\n",
+ " 'fwvihrakcere',\n",
+ " 'ivtubyjdtfyp',\n",
+ " 'sgkjfsfjxrqs',\n",
+ " 'lfmlbcmjzaco',\n",
+ " 'dxhqhvvwlbum',\n",
+ " 'tbvtnpaxtsfv',\n",
+ " 'tbvqrwvtygvl',\n",
+ " 'aldgihqhvvwl',\n",
+ " 'iumtxhwalpzm',\n",
+ " 'allnqxjgzona',\n",
+ " 'mmrtwmxnlhpt',\n",
+ " 'umucthkdvqqi',\n",
+ " 'loqrzzvsfxkr',\n",
+ " 'yralwgzolmvj',\n",
+ " 'uhqhvypauqay',\n",
+ " 'anqhbmdgavtz',\n",
+ " 'hpaxfttlwlcm',\n",
+ " 'otodxjkqqrgl',\n",
+ " 'alfmlbcmuqbq',\n",
+ " 'eqzrhkpuewpq',\n",
+ " 'ivupagkjjkfu',\n",
+ " 'svrwsxbkpalq',\n",
+ " 'ivqrtfsgzolm',\n",
+ " 'rctsogcthpzr',\n",
+ " 'hlkurvalrmce',\n",
+ " 'rjgthcmbpiot',\n",
+ " 'ivtnhvzlhruh',\n",
+ " 'nrhkpumnqkll',\n",
+ " 'asfbhmalwmvu',\n",
+ " 'lpxrrhvhrspi',\n",
+ " 'rudrbknqfwha',\n",
+ " 'ivtzavianale',\n",
+ " 'ergtllgottbr',\n",
+ " 'iafbhmalqmrb',\n",
+ " 'otfmmnytsogc',\n",
+ " 'thonqkpalhfp',\n",
+ " 'wetwqtfxkxap',\n",
+ " 'muvgklnaaalm',\n",
+ " 'xqaspkowbuhd',\n",
+ " 'smzkjvvhvwzz',\n",
+ " 'rvpjdwfafalp',\n",
+ " 'iogtnlvxahtp',\n",
+ " 'askdzkhjburw',\n",
+ " 'ngbonatrfihq',\n",
+ " 'talqnzaclrgc',\n",
+ " 'umsnqkpaeqrq',\n",
+ " 'yqwrgxvpynqk',\n",
+ " 'uhtkvirvvgkh',\n",
+ " 'talrbpmpvfam',\n",
+ " 'nfodvkavvvvh',\n",
+ " 'uwghwhsqmcki',\n",
+ " 'txhjnvgllujv',\n",
+ " 'ksvtubgalfjb',\n",
+ " 'txvsjtpstyal',\n",
+ " 'arifugnpgenq',\n",
+ " 'rrppckwimutl',\n",
+ " 'epermtyalmzt',\n",
+ " 'oaymnqhvjslf',\n",
+ " 'slbcmsskslfm',\n",
+ " 'tbcmkugrgxhw',\n",
+ " 'hlvrnxyrrilf',\n",
+ " 'frgnbvlzfkov',\n",
+ " 'nvvtzhtntwea',\n",
+ " 'eeizyltjhvaz',\n",
+ " 'ehwalqqrjeba',\n",
+ " 'dhgkumtbwbfg',\n",
+ " 'majzhwhhxerj',\n",
+ " 'bznxbrralmzt',\n",
+ " 'oaymnqhvdmrt',\n",
+ " 'umxnlhptcmuc',\n",
+ " 'thkwsxnvnlwj',\n",
+ " 'ptvjmudhhwhh',\n",
+ " 'rvetlwgtvxej',\n",
+ " 'webajclrgcwm',\n",
+ " 'ftfkalwskost',\n",
+ " 'hpaeqrgabmab',\n",
+ " 'wwslahtvcthv',\n",
+ " 'iuewpqykvetx',\n",
+ " 'dzebajclrgcw',\n",
+ " 'szlgcrvjzfwj',\n",
+ " 'pgvtprvhdnra',\n",
+ " 'ftfxkvpmtyal',\n",
+ " 'cqrhbxnqwhuk',\n",
+ " 'talvnebaaalw',\n",
+ " 'tkfbtkwlhtya',\n",
+ " 'evvqmivvvtrp',\n",
+ " 'gowbanizvwsr',\n",
+ " 'rvwlxhvslfml',\n",
+ " 'icmsnqkpayau',\n",
+ " 'ruvxtfkalgtz',\n",
+ " 'mqwlalcfhdfq',\n",
+ " 'myubmxhdggiv',\n",
+ " 'slmalvfamnfg',\n",
+ " 'lolmvjavrbzj',\n",
+ " 'antkjtfjsfjt',\n",
+ " 'asksgkjwfafa',\n",
+ " 'atalpwzbrerk',\n",
+ " 'hjcthctkjvvh',\n",
+ " 'taljtfxkvpyn',\n",
+ " 'dwaltgzagbrv',\n",
+ " 'slhqclrgcwms',\n",
+ " 'nqkpaeqrfgwb',\n",
+ " 'wwslahtvctho',\n",
+ " 'nqkpaeqrevxn',\n",
+ " 'rerhwhqcrizl',\n",
+ " 'ergalmzylerk',\n",
+ " 'szlevtuebaaa',\n",
+ " 'ewzhmqstyalm',\n",
+ " 'rsbrxgivjeba',\n",
+ " 'talhhzdttvga',\n",
+ " 'egqzootonaht',\n",
+ " 'ddwjpcthamrt',\n",
+ " 'hlhwalwmlmdd',\n",
+ " 'ofjoebaaalxp',\n",
+ " 'ooqkctlejqjg',\n",
+ " 'ntnponifjtfv',\n",
+ " 'talqabghonnw',\n",
+ " 'aibbvthbrhky',\n",
+ " 'pgfjdaawbrhz',\n",
+ " 'ibacdbtldsnq',\n",
+ " 'wwtxvwtfwndz',\n",
+ " 'ddyqsszllhdd',\n",
+ " 'gxvihzebajcl',\n",
+ " 'ggcwmklkrpet',\n",
+ " 'dwbonamhvpat',\n",
+ " 'orbshqhvypas',\n",
+ " 'rdailylgqbpg',\n",
+ " 'alphwalxklyg',\n",
+ " 'odnmtyalgqrh',\n",
+ " 'xevzolvtovup',\n",
+ " 'stsveslialtx',\n",
+ " 'talwwgwlzbrm',\n",
+ " 'fwfaqenqvgha',\n",
+ " 'emfqaspkowbp',\n",
+ " 'rfgkwhwalwwe',\n",
+ " 'thukvdmnviiv',\n",
+ " 'fjvzwfdmksvt',\n",
+ " 'llnqiflwltef',\n",
+ " 'gjxhhgnbttvj',\n",
+ " 'rlgfpkrdyqdl',\n",
+ " 'txvwwvihiwfa',\n",
+ " 'talmzkhfdqrg',\n",
+ " 'ofjuclphrbvq',\n",
+ " 'anqufamnnlts',\n",
+ " 'exalcpvwlxhd',\n",
+ " 'nqpmdhwsctzn',\n",
+ " 'ikgwgtluotls',\n",
+ " 'nqvzlitxvtxr',\n",
+ " 'tbbnxhjtfkal',\n",
+ " 'izjsfjhhptdz',\n",
+ " 'rrnpgsjzvtqa',\n",
+ " 'eaebalbehuml',\n",
+ " 'iwbgalcqdpti',\n",
+ " 'uhgbtealcfhd',\n",
+ " 'rvgqjzvvhvmz',\n",
+ " 'fnkkmrgejrhq',\n",
+ " 'obgbvhysbghh',\n",
+ " 'hljtfkkvwkst',\n",
+ " 'nbjdwamgamod',\n",
+ " 'evvgcthfvtdf',\n",
+ " 'txhwhhalppkg',\n",
+ " 'tnmgtyalbqas',\n",
+ " 'ekowbtkquvna',\n",
+ " 'nqdtelslahnq',\n",
+ " 'ehwalgqrhbqh',\n",
+ " 'hpaksfjooitx',\n",
+ " 'ntxvggmddvtc',\n",
+ " 'ofulvefaqsty',\n",
+ " 'hlvvgqjzvpmt',\n",
+ " 'talgqrhbxnqw',\n",
+ " 'hlvvxnlebtya',\n",
+ " 'expkoqkctleg',\n",
+ " 'aewsrxxrngxh',\n",
+ " 'talqmlwaprur',\n",
+ " 'nnnqdwwruhhs',\n",
+ " 'erfawbflhhal',\n",
+ " 'smlmddjfjwec',\n",
+ " 'hahfvggmdzef',\n",
+ " 'ardatkndzllv',\n",
+ " 'ehlcgidlrgal',\n",
+ " 'ypvxbzvhiwfa',\n",
+ " 'muttbtrpqwvm',\n",
+ " 'ikgkrzfpuwsv',\n",
+ " 'ervmhwhhavgw',\n",
+ " 'bsrvzppkowba',\n",
+ " 'aizvwtvnbpvd',\n",
+ " 'exapazpalhfp',\n",
+ " 'wetwcvwlhfvx',\n",
+ " 'hlmzyvbbilvr',\n",
+ " 'equmwgtwfaqa',\n",
+ " 'evvhhrvmhwal',\n",
+ " 'cqrhblqewfet',\n",
+ " 'rlgnzralkxve',\n",
+ " 'tlsctznnkgwg',\n",
+ " 'fhcthonqkpae',\n",
+ " 'erevgqfulvtz',\n",
+ " 'hlmzktlpmaht',\n",
+ " 'ryhphlalqagl',\n",
+ " 'iubdfktngmts',\n",
+ " 'ksphvzyhqhvk',\n",
+ " 'akornsshpalh',\n",
+ " 'rzinnnqlbipi',\n",
+ " 'nfeqkxvetejr',\n",
+ " 'hhtmhqqbgbvh',\n",
+ " 'exhdgfhxgvbb',\n",
+ " 'talxklnatgml',\n",
+ " 'bfgqbpgelphi',\n",
+ " 'ofdmnlekrrvr',\n",
+ " 'tbwbflhqqaqc',\n",
+ " 'exbeetwcvwlb',\n",
+ " 'nctecgoxbkev',\n",
+ " 'gzahtmahtmkl',\n",
+ " 'tadetwzbrhdy',\n",
+ " 'bfxhzojauruh',\n",
+ " 'dxhgbtealroz',\n",
+ " 'talkrzfzwimo',\n",
+ " 'obqhvjgtyale',\n",
+ " 'npkmrgpkfco']"
+ ]
+ },
+ "execution_count": 143,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "chunks(srwcb, 12)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# hill_matrix = [[1] * (i + 1) + [0] * (12 - (i + 1)) for i in range(12)]\n",
+ "# hill_matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 170,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
+ " [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
+ " [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
+ " [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n",
+ " [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0],\n",
+ " [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],\n",
+ " [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],\n",
+ " [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],\n",
+ " [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],\n",
+ " [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0],\n",
+ " [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],\n",
+ " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]"
+ ]
+ },
+ "execution_count": 170,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_matrix = [list(reversed([0] * (12 - (i + 1)) + [1, 1] + [0] * 12))[-12:] for i in range(12)]\n",
+ "hill_matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'yearningforrespitetheromanssufferedasdaysturnedintoweeksandweeksintomonthswithcalgacusandthecaledoniiperfectlycontenttolaysiegeintheirownlandourknowledgeofthisdreadfulperiodcomesfromthefollowingaccountbymarcusfideliuscatoundersiegeforninelongmonthstrappedbywallswebuilttodefendourselvesherdedandpennedlikesheepwithinourrefugethefortatcarridenagainstusisarrayedthemightofthecaledonianarmyandournemesiscalgacusisgrinningwhilehewatchesussquirminthishellbetrayedbyourownleadersalustiusvolunteersallsomanygoodandbraveromanshavelosttheirlivesandthemoraleofthemenhereatcarridenisworseningbythedayexhaustedandstarvingthemencatchwhattheycantoeataroundthefortmostlyratssomecatsalthoughtheytooareskinandbonesbravebutdesperatesomespeakprivatelyofamutinytooverthrowsalustiusandiamtemptedtoagreewiththemevensoforallhisfaultssalustiusisstillaromanandiamunderhiscommandexhaustedthoughiambeingaromanstillmeanssomethingtomeevensofarawayfromlatiumanditsglorioussunneverthelessifearthatsoonthemenwillturntodarkerandmoresavagemethodstofeedthemselvesandifnoprogresshasbeenmadeiwillsoonhavetoreconsiderwhatimustdotogetasmanygoodromanssafelyhomeaspossiblebidinghistimecalgacuswaitedandwatcheduntilhejudgedthattheromansweresufficientlyweakenedthensentamessengertosalustiusofferingpeaceinexchangeforthelandsofcaledoniaenvoyspromisedsafepassageallowingsalustiustoreturntoromeifheagreedtoleavecaledoniaandneverreturnthecaledoniihadtwoconditionsromemustabandontheremainingsoldiersoftheixthlegionleavingthemashostagesandthecodexmustremainatcarridenarrivinginromewithoutthecodexwouldcondemnsalustiustocertaindeathandhecouldneveragreetosuchtermsbuthestillpossessedthemonsgraupiusforgeryandisuspecthehopedtotradethatandtheremaininglegionnairesoftheixthforhisownfreedomyearningonlyforhisownsafetysalustiusriskedunderestimatinghisfoebutindoingsohealsounderestimatedtheloyalanduprightmarcusfideliuscatowhocouldneverbetraythesoldiersunderhiscommandexposingthisfatallackofjudgementsalustiuscondemnedhimselfinhisownwordsdoiknowthemindofasoldierlikecatobythegodsidoyearsofcampaigninghavehardenedhimandhehasnotthesubtletytoharbourdarkandcunningthoughtsmentalagilityisnotthemarkofamanlikecatoandhistorywillforgethimintruththeixthlegionhadsufferedseverelyfromtheligaturethatwasslowlydrawntightaroundthembycalgacusandhismendysenteryandhungerravagedthenobleromanswhowerereducedtoemaciatedghostschokingonthebitterbileofthearroganceandrapaciouscrueltyoftheircommandersalustiusassalustiusscentedtherankodourofmutinybeginningtofilltheairhepunishedthemenwithdecimationsomovedtotearsbypitytheircommandermarcusfideliuscatowasfinallypersuadedtotreatsecretlywithcalgacusforthesakeofhismenthusitwasthatcatohimselftreatedwithcalgacushecarefullypreparedanewforgeryofthecodexandtogetherwiththestrongestoftheremaininglegionnairesarrestedsalustiusandhisguardsforthecrimestheyhadcommittedagainsttheromansoldiersinexchangeforsafepassagefromthathellonearthcatoofferedtheforgeryandtheprisonerstocalgacusandhismensoitwasthatcatoandhismenreturnedtocarridentheirheartsheavywiththeshameoftheirbargainwiththedevilinthecoldlightofdawncatomarchedthesurvivorswiththetwoaquilaeflyinghighbeforethemontoanawaitingbarqueprovisionedwithvitalsandwaterforfivedaysashehadagreedwithcalgacusstrappedtighttohisbodyunderhisarmourheconcealedthetruecopyofthecodexholdinginhisbreastplatethesecurityofromeandsotheixthlegioncrossedtheseatogermaniainferiormakinglandfallatlugdunumbatavorumtwodayslaterfreedfromtheirtormentorscaledoniiandromanaliketheyrestedandmadesacrificesofgoatsandsheepingratitudefortheirsafedeliveranceovercomewithexhaustiontheysleptuntiltheyhadrecoveredsufficientlytocontinueontothefortressatnoviomaguswherecatoreportedtothelegatusofthexthlegiongeminaandatlasthandedthecodextohissafekeepingreceivingwordinromeoftherecoveryofthecodexandthereturnofthetwoaquilaecaesargrantedthemallpardonandawardedpensionstothesurvivorseachtoreceiveafarmoffiveherediumwhentheyretiredfrommilitaryserviceglorywasdeniedtothosebravelegionnairesbutihopethishistorywillrestoretheirhonourenemiesofromeweredeniedthecodexoccultarumbythegreatsacrificesofcatoandhismenrecordingtheirtaleisperhapsthemostimportanttaskihaveundertakenasahistoriananditpainsmegreatlythattocontinuetoprotectitthetruthmustbeconcealedformanygenerationstocomeyetiwillrestinpeaceknowingthatthattruthwillonedaybetoldguardeduntilthenbythegloriouswondersoftheancientworldx'"
+ ]
+ },
+ "execution_count": 171,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hill_decipher(hill_matrix, srwcb)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 159,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'YEARNING FOR RESPITE THE ROMANS SUFFERED AS DAYS TURNED INTO WEEKS AND WEEKS INTO MONTHS, WITH CALGACUS AND THE CALEDONII PERFECTLY CONTENT TO LAY SIEGE IN THEIR OWN LAND. OUR KNOWLEDGE OF THIS DREADFUL PERIOD COMES FROM THE FOLLOWING ACCOUNT BY MARCUS FIDELIUS CATO.“ UNDER SIEGE FOR NINE LONG MONTHS, TRAPPED BY WALLS WE BUILT TO DEFEND OURSELVES. HERDED AND PENNED LIKE SHEEP WITHIN OUR REFUGE, THE FORT AT CARRIDEN. AGAINST US IS ARRAYED THE MIGHT OF THE CALEDONIAN ARMY, AND OUR NEMESIS CALGACUS IS GRINNING WHILE HE WATCHES US SQUIRM IN THIS HELL, BETRAYED BY OUR OWN LEADER SALUSTIUS. VOLUNTEERS ALL, SO MANY GOOD AND BRAVE ROMANS HAVE LOST THEIR LIVES, AND THE MORALE OF THE MEN HERE AT CARRIDEN IS WORSENING BY THE DAY. EXHAUSTED AND STARVING THE MEN CATCH WHAT THEY CAN TO EAT AROUND THE FORT, MOSTLY RATS, SOME CATS, ALTHOUGH THEY TOO ARE SKIN AND BONES. BRAVE BUT DESPERATE, SOME SPEAK PRIVATELY OF A MUTINY TO OVERTHROW SALUSTIUS, AND I AM TEMPTED TO AGREE WITH THEM. EVEN SO, FOR ALL HIS FAULTS, SALUSTIUS IS STILL A ROMAN AND I AM UNDER HIS COMMAND. EXHAUSTED THOUGH I AM, BEING A ROMAN STILL MEANS SOMETHING TO ME, EVEN SO FAR AWAY FROM LATIUM AND ITS GLORIOUS SUN. NEVERTHELESS, I FEAR THAT SOON THE MEN WILL TURN TO DARKER AND MORE SAVAGE METHODS TO FEED THEMSELVES AND IF NO PROGRESS HAS BEEN MADE, I WILL SOON HAVE TO RECONSIDER WHAT I MUST DO TO GET AS MANY GOOD ROMANS SAFELY HOME AS POSSIBLE.” BIDING HIS TIME CALGACUS WAITED AND WATCHED UNTIL HE JUDGED THAT THE ROMANS WERE SUFFICIENTLY WEAKENED, THEN SENT A MESSENGER TO SALUSTIUS OFFERING PEACE IN EXCHANGE FOR THE LANDS OF CALEDONIA. ENVOYS PROMISED SAFE PASSAGE, ALLOWING SALUSTIUS TO RETURN TO ROME IF HE AGREED TO LEAVE CALEDONIA AND NEVER RETURN. THE CALEDONII HAD TWO CONDITIONS. ROME MUST ABANDON THE REMAINING SOLDIERS OF THE IXTH LEGION, LEAVING THEM AS HOSTAGES; AND THE CODEX MUST REMAIN AT CARRIDEN. ARRIVING IN ROME WITHOUT THE CODEX WOULD CONDEMN SALUSTIUS TO CERTAIN DEATH, AND HE COULD NEVER AGREE TO SUCH TERMS, BUT HE STILL POSSESSED THE MONS GRAUPIUS FORGERY AND I SUSPECT HE HOPED TO TRADE THAT AND THE REMAINING LEGIONNAIRES OF THE IXTH FOR HIS OWN FREEDOM. YEARNING ONLY FOR HIS OWN SAFETY, SALUSTIUS RISKED UNDERESTIMATING HIS FOE, BUT IN DOING SO HE ALSO UNDERESTIMATED THE LOYAL AND UPRIGHT MARCUS FIDELIUS CATO WHO COULD NEVER BETRAY THE SOLDIERS UNDER HIS COMMAND. EXPOSING THIS FATAL LACK OF JUDGEMENT, SALUSTIUS CONDEMNED HIMSELF IN HIS OWN WORDS. “DO I KNOW THE MIND OF A SOLDIER LIKE CATO? BY THE GODS I DO. YEARS OF CAMPAIGNING HAVE HARDENED HIM AND HE HAS NOT THE SUBTLETY TO HARBOUR DARK AND CUNNING THOUGHTS. MENTAL AGILITY IS NOT THE MARK OF A MAN LIKE CATO AND HISTORY WILL FORGET HIM.” IN TRUTH THE IXTH LEGION HAD SUFFERED SEVERELY FROM THE LIGATURE THAT WAS SLOWLY DRAWN TIGHT AROUND THEM BY CALGACUS AND HIS MEN. DYSENTERY AND HUNGER RAVAGED THE NOBLE ROMANS WHO WERE REDUCED TO EMACIATED GHOSTS, CHOKING ON THE BITTER BILE OF THE ARROGANCE AND RAPACIOUS CRUELTY OF THEIR COMMANDER SALUSTIUS. AS SALUSTIUS SCENTED THE RANK ODOUR OF MUTINY BEGINNING TO FILL THE AIR HE PUNISHED THE MEN WITH DECIMATION. SO, MOVED TO TEARS BY PITY, THEIR COMMANDER MARCUS FIDELIUS CATO WAS FINALLY PERSUADED TO TREAT SECRETLY WITH CALGACUS FOR THE SAKE OF HIS MEN. THUS IT WAS THAT CATO HIMSELF TREATED WITH CALGACUS. HE CAREFULLY PREPARED A NEW FORGERY OF THE CODEX AND TOGETHER WITH THE STRONGEST OF THE REMAINING LEGIONNAIRES ARRESTED SALUSTIUS AND HIS GUARDS FOR THE CRIMES THEY HAD COMMITTED AGAINST THE ROMAN SOLDIERS. IN EXCHANGE FOR SAFE PASSAGE FROM THAT HELL ON EARTH, CATO OFFERED THE FORGERY AND THE PRISONERS TO CALGACUS AND HIS MEN. SO IT WAS THAT CATO AND HIS MEN RETURNED TO CARRIDEN, THEIR HEARTS HEAVY WITH THE SHAME OF THEIR BARGAIN WITH THE DEVIL. IN THE COLD LIGHT OF DAWN, CATO MARCHED THE SURVIVORS, WITH THE TWO AQUILAE FLYING HIGH BEFORE THEM, ONTO AN AWAITING BARQUE PROVISIONED WITH VITALS AND WATER FOR FIVE DAYS, AS HE HAD AGREED WITH CALGACUS. STRAPPED TIGHT TO HIS BODY, UNDER HIS ARMOUR, HE CONCEALED THE TRUE COPY OF THE CODEX, HOLDING IN HIS BREASTPLATE THE SECURITY OF ROME. AND SO THE IXTH LEGION CROSSED THE SEA TO GERMANIA INFERIOR, MAKING LANDFALL AT LUGDUNUM BATAVORUM TWO DAYS LATER. FREED FROM THEIR TORMENTORS, CALEDONII AND ROMAN ALIKE, THEY RESTED AND MADE SACRIFICES OF GOATS AND SHEEP IN GRATITUDE FOR THEIR SAFE DELIVERANCE. OVERCOME WITH EXHAUSTION THEY SLEPT, UNTIL THEY HAD RECOVERED SUFFICIENTLY TO CONTINUE ON TO THE FORTRESS AT NOVIOMAGUS WHERE CATO REPORTED TO THE LEGATUS OF THE XTH LEGION GEMINA AND, AT LAST, HANDED THE CODEX TO HIS SAFE KEEPING. RECEIVING WORD IN ROME OF THE RECOVERY OF THE CODEX AND THE RETURN OF THE TWO AQUILAE, CAESAR GRANTED THEM ALL PARDON AND AWARDED PENSIONS TO THE SURVIVORS, EACH TO RECEIVE A FARM OF FIVE HEREDIUM WHEN THEY RETIRED FROM MILITARY SERVICE. GLORY WAS DENIED TO THOSE BRAVE LEGIONNAIRES, BUT I HOPE THIS HISTORY WILL RESTORE THEIR HONOUR. ENEMIES OF ROME WERE DENIED THE CODEX OCCULTARUM BY THE GREAT SACRIFICES OF CATO AND HIS MEN. RECORDING THEIR TALE IS PERHAPS THE MOST IMPORTANT TASK I HAVE UNDERTAKEN AS A HISTORIAN, AND IT PAINS ME GREATLY THAT, TO CONTINUE TO PROTECT IT, THE TRUTH MUST BE CONCEALED FOR MANY GENERATIONS TO COME. YET I WILL REST IN PEACE KNOWING THAT THAT TRUTH WILL ONE DAY BE TOLD, GUARDED UNTIL THEN BY THE GLORIOUS WONDERS OF THE ANCIENT WORLD.'"
+ ]
+ },
+ "execution_count": 159,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "repunctuate(hill_decipher(hill_matrix, srwcb), pub)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 162,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'yearningforr'"
+ ]
+ },
+ "execution_count": 162,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "autokey_decipher(srwcb[:12], 'a')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 166,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'YEARNING FOR RESPITE THE ROMANS SUFFERED AS DAYS TURNED INTO WEEKS AND WEEKS INTO MONTHS, WITH CALGACUS AND THE CALEDONII PERFECTLY CONTENT TO LAY SIEGE IN THEIR OWN LAND. OUR KNOWLEDGE OF THIS DREADFUL PERIOD COMES FROM THE FOLLOWING ACCOUNT BY MARCUS FIDELIUS CATO.“ UNDER SIEGE FOR NINE LONG MONTHS, TRAPPED BY WALLS WE BUILT TO DEFEND OURSELVES. HERDED AND PENNED LIKE SHEEP WITHIN OUR REFUGE, THE FORT AT CARRIDEN. AGAINST US IS ARRAYED THE MIGHT OF THE CALEDONIAN ARMY, AND OUR NEMESIS CALGACUS IS GRINNING WHILE HE WATCHES US SQUIRM IN THIS HELL, BETRAYED BY OUR OWN LEADER SALUSTIUS. VOLUNTEERS ALL, SO MANY GOOD AND BRAVE ROMANS HAVE LOST THEIR LIVES, AND THE MORALE OF THE MEN HERE AT CARRIDEN IS WORSENING BY THE DAY. EXHAUSTED AND STARVING THE MEN CATCH WHAT THEY CAN TO EAT AROUND THE FORT, MOSTLY RATS, SOME CATS, ALTHOUGH THEY TOO ARE SKIN AND BONES. BRAVE BUT DESPERATE, SOME SPEAK PRIVATELY OF A MUTINY TO OVERTHROW SALUSTIUS, AND I AM TEMPTED TO AGREE WITH THEM. EVEN SO, FOR ALL HIS FAULTS, SALUSTIUS IS STILL A ROMAN AND I AM UNDER HIS COMMAND. EXHAUSTED THOUGH I AM, BEING A ROMAN STILL MEANS SOMETHING TO ME, EVEN SO FAR AWAY FROM LATIUM AND ITS GLORIOUS SUN. NEVERTHELESS, I FEAR THAT SOON THE MEN WILL TURN TO DARKER AND MORE SAVAGE METHODS TO FEED THEMSELVES AND IF NO PROGRESS HAS BEEN MADE, I WILL SOON HAVE TO RECONSIDER WHAT I MUST DO TO GET AS MANY GOOD ROMANS SAFELY HOME AS POSSIBLE.” BIDING HIS TIME CALGACUS WAITED AND WATCHED UNTIL HE JUDGED THAT THE ROMANS WERE SUFFICIENTLY WEAKENED, THEN SENT A MESSENGER TO SALUSTIUS OFFERING PEACE IN EXCHANGE FOR THE LANDS OF CALEDONIA. ENVOYS PROMISED SAFE PASSAGE, ALLOWING SALUSTIUS TO RETURN TO ROME IF HE AGREED TO LEAVE CALEDONIA AND NEVER RETURN. THE CALEDONII HAD TWO CONDITIONS. ROME MUST ABANDON THE REMAINING SOLDIERS OF THE IXTH LEGION, LEAVING THEM AS HOSTAGES; AND THE CODEX MUST REMAIN AT CARRIDEN. ARRIVING IN ROME WITHOUT THE CODEX WOULD CONDEMN SALUSTIUS TO CERTAIN DEATH, AND HE COULD NEVER AGREE TO SUCH TERMS, BUT HE STILL POSSESSED THE MONS GRAUPIUS FORGERY AND I SUSPECT HE HOPED TO TRADE THAT AND THE REMAINING LEGIONNAIRES OF THE IXTH FOR HIS OWN FREEDOM. YEARNING ONLY FOR HIS OWN SAFETY, SALUSTIUS RISKED UNDERESTIMATING HIS FOE, BUT IN DOING SO HE ALSO UNDERESTIMATED THE LOYAL AND UPRIGHT MARCUS FIDELIUS CATO WHO COULD NEVER BETRAY THE SOLDIERS UNDER HIS COMMAND. EXPOSING THIS FATAL LACK OF JUDGEMENT, SALUSTIUS CONDEMNED HIMSELF IN HIS OWN WORDS. “DO I KNOW THE MIND OF A SOLDIER LIKE CATO? BY THE GODS I DO. YEARS OF CAMPAIGNING HAVE HARDENED HIM AND HE HAS NOT THE SUBTLETY TO HARBOUR DARK AND CUNNING THOUGHTS. MENTAL AGILITY IS NOT THE MARK OF A MAN LIKE CATO AND HISTORY WILL FORGET HIM.” IN TRUTH THE IXTH LEGION HAD SUFFERED SEVERELY FROM THE LIGATURE THAT WAS SLOWLY DRAWN TIGHT AROUND THEM BY CALGACUS AND HIS MEN. DYSENTERY AND HUNGER RAVAGED THE NOBLE ROMANS WHO WERE REDUCED TO EMACIATED GHOSTS, CHOKING ON THE BITTER BILE OF THE ARROGANCE AND RAPACIOUS CRUELTY OF THEIR COMMANDER SALUSTIUS. AS SALUSTIUS SCENTED THE RANK ODOUR OF MUTINY BEGINNING TO FILL THE AIR HE PUNISHED THE MEN WITH DECIMATION. SO, MOVED TO TEARS BY PITY, THEIR COMMANDER MARCUS FIDELIUS CATO WAS FINALLY PERSUADED TO TREAT SECRETLY WITH CALGACUS FOR THE SAKE OF HIS MEN. THUS IT WAS THAT CATO HIMSELF TREATED WITH CALGACUS. HE CAREFULLY PREPARED A NEW FORGERY OF THE CODEX AND TOGETHER WITH THE STRONGEST OF THE REMAINING LEGIONNAIRES ARRESTED SALUSTIUS AND HIS GUARDS FOR THE CRIMES THEY HAD COMMITTED AGAINST THE ROMAN SOLDIERS. IN EXCHANGE FOR SAFE PASSAGE FROM THAT HELL ON EARTH, CATO OFFERED THE FORGERY AND THE PRISONERS TO CALGACUS AND HIS MEN. SO IT WAS THAT CATO AND HIS MEN RETURNED TO CARRIDEN, THEIR HEARTS HEAVY WITH THE SHAME OF THEIR BARGAIN WITH THE DEVIL. IN THE COLD LIGHT OF DAWN, CATO MARCHED THE SURVIVORS, WITH THE TWO AQUILAE FLYING HIGH BEFORE THEM, ONTO AN AWAITING BARQUE PROVISIONED WITH VITALS AND WATER FOR FIVE DAYS, AS HE HAD AGREED WITH CALGACUS. STRAPPED TIGHT TO HIS BODY, UNDER HIS ARMOUR, HE CONCEALED THE TRUE COPY OF THE CODEX, HOLDING IN HIS BREASTPLATE THE SECURITY OF ROME. AND SO THE IXTH LEGION CROSSED THE SEA TO GERMANIA INFERIOR, MAKING LANDFALL AT LUGDUNUM BATAVORUM TWO DAYS LATER. FREED FROM THEIR TORMENTORS, CALEDONII AND ROMAN ALIKE, THEY RESTED AND MADE SACRIFICES OF GOATS AND SHEEP IN GRATITUDE FOR THEIR SAFE DELIVERANCE. OVERCOME WITH EXHAUSTION THEY SLEPT, UNTIL THEY HAD RECOVERED SUFFICIENTLY TO CONTINUE ON TO THE FORTRESS AT NOVIOMAGUS WHERE CATO REPORTED TO THE LEGATUS OF THE XTH LEGION GEMINA AND, AT LAST, HANDED THE CODEX TO HIS SAFE KEEPING. RECEIVING WORD IN ROME OF THE RECOVERY OF THE CODEX AND THE RETURN OF THE TWO AQUILAE, CAESAR GRANTED THEM ALL PARDON AND AWARDED PENSIONS TO THE SURVIVORS, EACH TO RECEIVE A FARM OF FIVE HEREDIUM WHEN THEY RETIRED FROM MILITARY SERVICE. GLORY WAS DENIED TO THOSE BRAVE LEGIONNAIRES, BUT I HOPE THIS HISTORY WILL RESTORE THEIR HONOUR. ENEMIES OF ROME WERE DENIED THE CODEX OCCULTARUM BY THE GREAT SACRIFICES OF CATO AND HIS MEN. RECORDING THEIR TALE IS PERHAPS THE MOST IMPORTANT TASK I HAVE UNDERTAKEN AS A HISTORIAN, AND IT PAINS ME GREATLY THAT, TO CONTINUE TO PROTECT IT, THE TRUTH MUST BE CONCEALED FOR MANY GENERATIONS TO COME. YET I WILL REST IN PEACE KNOWING THAT THAT TRUTH WILL ONE DAY BE TOLD, GUARDED UNTIL THEN BY THE GLORIOUS WONDERS OF THE ANCIENT WORLD.'"
+ ]
+ },
+ "execution_count": 166,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pb = repunctuate(cat(autokey_decipher(c, 'a') for c in chunks(srwcb, 12)), pub)\n",
+ "pb"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5372"
+ ]
+ },
+ "execution_count": 167,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "open('8b.plaintext', 'w').write(pb)"
+ ]
+ },