Szyfr Bacona
Szyfr Bacona polega na zamianie każdej litery wiadomości na pięcioznakowy układ złożony z dwóch symboli, najczęściej A i B. Każda litera alfabetu ma swój własny zapis, na przykład jedna może być zapisana jako AAAAA, inna jako AAAAB, a kolejna jako AAABA.
Dzięki temu zwykły tekst można zamienić na ciąg grup złożonych tylko z dwóch znaków. Szyfr jest prosty, ale ciekawy, ponieważ pokazuje, że wiadomość można ukryć nie tylko przez przesuwanie liter, lecz także przez przypisanie każdej literze specjalnego kodu.

Program w Pythonie
W linijkach 1-30 znajduje się funkcja szyfr_bacona, czyli główna część programu. Funkcja otrzymuje dwa argumenty: tekst, czyli wiadomość do przetworzenia, oraz tryb, który decyduje, czy program ma szyfrować, czy deszyfrować.
W linijkach 2-8 zapisany jest słownik alfabet_bacona. Słownik został użyty dlatego, że szyfr Bacona działa na zasadzie par: każda litera ma przypisany konkretny pięcioznakowy kod złożony z liter A i B. Na przykład litera A ma kod AAAAA, litera B ma kod AAAAB, a litera K ma kod ABABA. Dzięki słownikowi program może szybko sprawdzić, jaki kod należy do danej litery.
W linijce 10 tworzona jest pusta lista wynik. Program będzie dopisywał do niej kolejne zakodowane fragmenty albo odszyfrowane litery. Lista jest wygodna, ponieważ później można łatwo połączyć jej elementy w jeden gotowy tekst.
W linijkach 12-18 program wykonuje szyfrowanie. Najpierw sprawdza, czy wybrany tryb to "szyfruj". Jeśli tak, przechodzi po kolei przez każdy znak wiadomości zamienionej na wielkie litery. Jeżeli trafi na spację, dopisuje znak /, żeby zaznaczyć przerwę między wyrazami. Jeżeli znak jest literą znajdującą się w słowniku, program dopisuje do listy jej kod Bacona.
W linijce 18 funkcja zwraca zaszyfrowaną wiadomość. Elementy listy są łączone spacjami, ponieważ każdy kod litery składa się z pięciu znaków i musi być oddzielony od następnego. Dzięki temu wynik jest czytelny, na przykład wiadomo, gdzie kończy się kod jednej litery, a zaczyna kod kolejnej.
W linijkach 20-22 tworzony jest drugi słownik odwrotny_bacon. Jest on potrzebny przy deszyfrowaniu. Pierwszy słownik działa w stronę: litera → kod Bacona, a przy deszyfrowaniu potrzebna jest odwrotna droga: kod Bacona → litera. Program tworzy więc nowy słownik automatycznie na podstawie poprzedniego.
W linijkach 24-28 wykonywane jest deszyfrowanie. Program dzieli zaszyfrowaną wiadomość na fragmenty za pomocą split(), czyli rozdziela tekst według spacji. Każdy fragment powinien być jednym pięcioznakowym kodem. Jeśli fragment to /, program dopisuje spację. Jeśli fragment znajduje się w słowniku odwrotny_bacon, program zamienia go z powrotem na literę.
W linijce 30 funkcja zwraca gotowy odszyfrowany tekst. Elementy listy są łączone bez dodatkowych znaków, ponieważ po odczytaniu kodu Bacona chcemy otrzymać zwykłą wiadomość.
Po zakończeniu funkcji zaczyna się część programu, w której korzystamy z tej funkcji. W linijce 32 tworzona jest zmienna tajemna_wiadomosc, w której zapisano tekst "TAJNY KOD".
W linijkach 34-35 program wywołuje funkcję szyfr_bacona w trybie "szyfruj". Wiadomość zostaje zamieniona na ciąg kodów z A i B, zapisana w zmiennej zaszyfrowana, a następnie wypisana na ekranie.
W linijkach 37-38 ta sama funkcja zostaje wywołana ponownie, ale tym razem w trybie "deszyfruj". Program bierze wcześniej zaszyfrowany tekst, zamienia pięcioznakowe kody z powrotem na litery, zapisuje wynik w zmiennej odszyfrowana i wypisuje go na ekranie.
def szyfr_bacona(tekst, tryb):alfabet_bacona = {"A": "AAAAA", "B": "AAAAB", "C": "AAABA", "D": "AAABB", "E": "AABAA","F": "AABAB", "G": "AABBA", "H": "AABBB", "I": "ABAAA", "J": "ABAAB","K": "ABABA", "L": "ABABB", "M": "ABBAA", "N": "ABBAB", "O": "ABBBA","P": "ABBBB", "Q": "BAAAA", "R": "BAAAB", "S": "BAABA", "T": "BAABB","U": "BABAA", "V": "BABAB", "W": "BABBA", "X": "BABBB", "Y": "BBAAA", "Z": "BBAAB"}wynik = []if tryb == "szyfruj":for znak in tekst.upper():if znak == " ":wynik.append("/")elif znak in alfabet_bacona:wynik.append(alfabet_bacona[znak])return " ".join(wynik)odwrotny_bacon = {}for litera in alfabet_bacona:odwrotny_bacon[alfabet_bacona[litera]] = literafor kod in tekst.split():if kod == "/":wynik.append(" ")elif kod in odwrotny_bacon:wynik.append(odwrotny_bacon[kod])return "".join(wynik)tajemna_wiadomosc = "TAJNY KOD"zaszyfrowana = szyfr_bacona(tajemna_wiadomosc, "szyfruj")print("Zaszyfrowana wiadomość:", zaszyfrowana)odszyfrowana = szyfr_bacona(zaszyfrowana, "deszyfruj")print("Odszyfrowana wiadomość:", odszyfrowana)