diff --git a/crittografia/alfabeto.py b/crittografia/alfabeto.py index 89174d9..1fade23 100644 --- a/crittografia/alfabeto.py +++ b/crittografia/alfabeto.py @@ -1,23 +1,24 @@ from .numeri import * alfabeto = tuple("abcdefghijklmnopqrstuvwxyz") -ordinale = dict([(k,i) for i,k in enumerate(alfabeto)]) +ordinale = dict([(k, i) for i, k in enumerate(alfabeto)]) + class codifica: - + def __init__(self, valore): """ Inizializzazione Fornire una stringa da crittografare. """ self.stringa = valore - + def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" ) return str.translate(self.stringa, rotazione) @@ -25,96 +26,97 @@ class codifica: def vigenère(self, verme): """ Cifrario di vigenère - Fornire una chiave alfabetica di lunghezza + Fornire una chiave alfabetica di lunghezza minore della stringa. (verme) """ - self.stringa = self.stringa.lower().replace(" ","") + self.stringa = self.stringa.lower().replace(" ", "") cifrata = "" - for i in range(len(self.stringa)): - cifrata += alfabeto[(ordinale[self.stringa[i]] + ordinale[verme[i % len(verme)]]) % 26] + for i, lettera in enumerate(self.stringa): + cifrata += alfabeto[(ordinale[lettera] + ordinale[verme[i % len(verme)]]) % 26] return cifrata - + def gödel(self, primo): """ Numero di Gödel Specificare un numero primo di partenza. """ - self.stringa = self.stringa.lower().replace(" ","") + self.stringa = self.stringa.lower().replace(" ", "") cifrata = 1 sequenza = primi.lista(primo, len(self.stringa)) - for i in range(len(self.stringa)): - cifrata *= sequenza[i]**(ordinale[self.stringa[i]] + 1) - return cifrata - + for i, lettera in enumerate(self.stringa): + cifrata *= sequenza[i] ** (ordinale[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(" ","") + self.stringa = self.stringa.lower().replace(" ", "") cifrata = "" if pad is (): pad = generatore.onetimepad(len(self.stringa)) - for i in range(len(self.stringa)): - cifrata += alfabeto[(ordinale[self.stringa[i]] + pad[i]) % 26] + for i, lettera in enumerate(self.stringa): + cifrata += alfabeto[(ordinale[lettera] + pad[i]) % 26] return cifrata, pad + class decodifica: - + def __init__(self, valore): """ Inizializzazione Fornire una stringa o un numero (di gödel) da decrittografare. """ - if str(valore).isnumeric(): + if str(valore).isnumeric(): self.numero = valore - else: - self.stringa = valore - + else: + self.stringa = valore + def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", + "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(" ","") + self.stringa = self.stringa.lower().replace(" ", "") decifrata = "" - for i in range(len(self.stringa)): - decifrata += (alfabeto[(ordinale[self.stringa[i]] - ordinale[verme[i % len(verme)]]) % 26]) + for i, lettera in enumerate(self.stringa): + decifrata += (alfabeto[(ordinale[lettera] - ordinale[verme[i % len(verme)]]) % 26]) return decifrata - + def gödel(self, primo, n): """ Numero di Gödel - Specificare un numero primo di partenza e + Specificare un numero primo di partenza e la lunghezza della stringa. """ decifrata = "" - for i in primi.lista(primo,n): + for i in primi.lista(primo, n): lettera = -1 while self.numero % i == 0: self.numero /= i lettera += 1 - decifrata += alfabeto[lettera % 26] + decifrata += alfabeto[lettera % 26] return decifrata - + def vernam(self, pad): """ Cifrario di Vernam Fornire il one-time-pad usato per crittografare la stringa. """ - self.stringa = self.stringa.lower().replace(" ","") + self.stringa = self.stringa.lower().replace(" ", "") cifrata = "" - for i in range(len(self.stringa)): - cifrata += alfabeto[(ordinale[self.stringa[i]] - pad[i]) % 26] + for i, lettera in enumerate(self.stringa): + cifrata += alfabeto[(ordinale[lettera] - pad[i]) % 26] return cifrata diff --git a/crittografia/numeri.py b/crittografia/numeri.py index 394e0cf..e70351c 100644 --- a/crittografia/numeri.py +++ b/crittografia/numeri.py @@ -9,37 +9,39 @@ opzioni = { "frames_per_buffer": 1024 } + class primi: - + def primo(n): """ Restituisce True se n è primo altrimenti restituisce False. """ - for i in range(3, int(math.sqrt(n)) + 1,2): + for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: return False return True - + def prossimo(n): """ - Restituisce il più piccolo numero primo maggiore di n. + Restituisce il più piccolo numero primo maggiore di n. [Generatore] """ - if n % 2 == 0: + if n % 2 == 0: n += 1 while True: n += 2 - if primi.primo(n): + if primi.primo(n): yield n - + def lista(p, n): """ Restituisce una n-tupla con i numeri primi maggiori di p. """ return tuple([p for p in itertools.islice(primi.prossimo(p), n)]) + class generatore: - + def caso(inizio, fine, n): """ Restituisce n interi casuali nell'intervallo [inizio; fine). @@ -47,11 +49,11 @@ class generatore: """ audio = pyaudio.PyAudio() input = audio.open(**opzioni) - dati = input.read(opzioni["rate"]//opzioni["frames_per_buffer"] * n//2) + dati = input.read(opzioni["rate"] // opzioni["frames_per_buffer"] * n // 2) input.close() audio.terminate() dati = [i for i in dati if i != 0] - dati = [i for i in dati if i in range(inizio,fine)] + dati = [i for i in dati if i in range(inizio, fine)] random.shuffle(dati) for i in range(n): yield dati[i] @@ -60,4 +62,4 @@ class generatore: """ Ritorna una l-tupla di interi casuali per un one-time-pad. """ - return tuple(generatore.caso(0,2*16,l)) + return tuple(generatore.caso(0, 2 * 16, l)) diff --git a/crittografia/unicode.py b/crittografia/unicode.py index 2f569a1..f3aee79 100644 --- a/crittografia/unicode.py +++ b/crittografia/unicode.py @@ -1,37 +1,38 @@ from .numeri import * -max = 2**(16) - +max = 2 ** 16 + + class codifica: - + def __init__(self, valore): """ Inizializzazione Fornire una stringa da crittografare. """ self.stringa = valore - + def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" ) return str.translate(self.stringa, rotazione) - + def vigenère(self, verme): """ Cifrario di vigenère - Fornire una chiave alfabetica di lunghezza + Fornire una chiave alfabetica di lunghezza minore della stringa. (verme) """ cifrata = "" - for i in range(len(self.stringa)): - cifrata += chr((ord(self.stringa[i]) + ord(verme[i % len(verme)])) % max) + for i, lettera in enumerate(self.stringa): + cifrata += chr((ord(lettera) + ord(verme[i % len(verme)])) % max) return cifrata - + def gödel(self, primo): """ Numero di Gödel @@ -39,10 +40,10 @@ class codifica: """ cifrata = 1 sequenza = primi.lista(primo, len(self.stringa)) - for i in range(len(self.stringa)): - cifrata *= sequenza[i]**(ord(self.stringa[i]) + 1) + for i, lettera in enumerate(self.stringa): + cifrata *= sequenza[i] ** (ord(lettera) + 1) return cifrata - + def vernam(self, pad=()): """ Cifrario di Vernam @@ -52,63 +53,64 @@ class codifica: cifrata = "" if pad is (): pad = generatore.onetimepad(len(self.stringa)) - for i in range(len(self.stringa)): - cifrata += chr((ord(self.stringa[i]) + pad[i]) % max) + for i, lettera in enumerate(self.stringa): + cifrata += chr((ord(lettera) + pad[i]) % max) return cifrata, pad + class decodifica: - + def __init__(self, valore): """ Inizializzazione Fornire una stringa o un numero (di gödel) da decrittografare. """ - if str(valore).isnumeric(): + if str(valore).isnumeric(): self.numero = valore - else: - self.stringa = valore + else: + self.stringa = valore def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", + "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) """ decifrata = "" - for i in range(len(self.stringa)): - decifrata += chr((ord(self.stringa[i]) - ord(verme[i % len(verme)])) % max) + for i, lettera in enumerate(self.stringa): + decifrata += chr((ord(lettera) - ord(verme[i % len(verme)])) % max) return decifrata - + def gödel(self, primo, n): """ Numero di Gödel - Specificare un numero primo di partenza e + Specificare un numero primo di partenza e la lunghezza della stringa. """ decifrata = "" - for i in primi.lista(primo,n): + for i in primi.lista(primo, n): lettera = -1 while self.numero % i == 0: self.numero /= i lettera += 1 decifrata += chr(lettera % max) return decifrata - + def vernam(self, pad): """ Cifrario di Vernam Fornire il one-time-pad usato per crittografare la stringa. """ cifrata = "" - for i in range(len(self.stringa)): - cifrata += chr((ord(self.stringa[i]) - pad[i]) % max) + for i, lettera in enumerate(self.stringa): + cifrata += chr((ord(lettera) - pad[i]) % max) return cifrata