from .numeri import * alfa = tuple("abcdefghijklmnopqrstuvwxyz") ord = {k: i for i, k in enumerate(alfa)} class codifica: def __init__(self, valore): """ Inizializzazione Fornire una stringa da crittografare. """ self.stringa = valore def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" ) return str.translate(self.stringa, rotazione) def vigenère(self, verme): """ Cifrario di vigenère Fornire una chiave alfabetica di lunghezza minore della stringa. (verme) """ self.stringa = self.stringa.lower().replace(" ", "") cifrata = [] for i, lettera in enumerate(self.stringa): cifrata.append( alfa[(ord[lettera] + ord[verme[i % len(verme)]]) % 26] ) return "".join(cifrata) def gödel(self, primo): """ Numero di Gödel Specificare un numero primo di partenza. """ self.stringa = self.stringa.lower().replace(" ", "") cifrata = 1 sequenza = primi.primi(primo, len(self.stringa)) for i, lettera in enumerate(self.stringa): cifrata *= next(sequenza) ** (ord[lettera] + 1) return cifrata def vernam(self, pad=()): """ Cifrario di Vernam Se non si fornisce un one-time-pad ne viene generato uno in automatico. """ self.stringa = self.stringa.lower().replace(" ", "") cifrata = [] if pad is (): pad = generatore.onetimepad(len(self.stringa)) for i, lettera in enumerate(self.stringa): cifrata.append( alfa[(ord[lettera] + pad[i]) % 26] ) return "".join(cifrata), pad class decodifica: def __init__(self, valore): """ Inizializzazione Fornire una stringa o un numero (di gödel) da decrittografare. """ if str(valore).isnumeric(): self.numero = valore else: self.stringa = valore def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ) return str.translate(self.stringa, rotazione) def vigenère(self, verme): """ Cifrario di vigenère Fornire la chiave usata per crittografare la stringa. (verme) """ self.stringa = self.stringa.lower().replace(" ", "") decifrata = [] for i, lettera in enumerate(self.stringa): decifrata.append( alfa[(ord[lettera] - ord[verme[i % len(verme)]]) % 26] ) return "".join(decifrata) def gödel(self, primo, n): """ Numero di Gödel Specificare un numero primo di partenza e la lunghezza della stringa. """ decifrata = [] for i in primi.primi(primo, n): lettera = -1 while self.numero % i == 0: self.numero /= i lettera += 1 decifrata.append(alfa[lettera % 26]) return "".join(decifrata) def vernam(self, pad): """ Cifrario di Vernam Fornire il one-time-pad usato per crittografare la stringa. """ self.stringa = self.stringa.lower().replace(" ", "") cifrata = [] for i, lettera in enumerate(self.stringa): cifrata.append( alfa[(ord[lettera] - pad[i]) % 26] ) return "".join(cifrata)