1.3 KiB
status: hidden title: Python — Uncipher slug: aena5lohSh5ri8-uncipher robots: noindex
Break a substitution cipher
Introduction
The project name is: uncipher You'll give back your project using this protocol: https://mdk.fr/pages/obiree2uaza2sh-rendu.html
Project
Make a program taking a dictionary file and a string, like:
python3 subst_break.py /usr/share/dict/french 'Cpokpvs mft hfot'
Your program should try every possible alphabetic substitution (in the alphabetic or ASCII range, maybe try different alphabets if needed), rank them by probability of being a real clear text (by counting the words being in the dictionary, doing frequency analysis on the letters, whatever...).
Your program should then print the most probable one (should easily be the right one in your tests).
You can write your own implementation of a substitution cipher for tests purpose in the ASCII range like this:
''.join([chr(ord(x) + 1) for x in "Bonjour les gens"])
(beware, I miss a modulo 255, correct implementation left as an exercise).
Or in a given alphabet like this:
import string
alphabet = string.ascii_lowercase * 2
for shift in range(1, 10):
print(''.join([alphabet[alphabet.index(x) + shift] if x in alphabet else x for x in "bonjour les gens"]))