diff --git a/crittografia/alfabeto.py b/crittografia/alfabeto.py index 6779d62..8ca5924 100644 --- a/crittografia/alfabeto.py +++ b/crittografia/alfabeto.py @@ -11,15 +11,15 @@ class codifica: Inizializzazione Fornire una stringa da crittografare. """ - self.stringa = valore + self.stringa = valore.lower().replace(" ", "") def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", - "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" + "abcdefghijklmnopqrstuvwxyz", + "nopqrstuvwxyzabcdefghijklm" ) return str.translate(self.stringa, rotazione) @@ -29,7 +29,6 @@ class codifica: 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( @@ -37,12 +36,11 @@ class codifica: ) return "".join(cifrata) - def gödel(self, primo): + def gödel(self, primo=2): """ 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): @@ -55,7 +53,6 @@ class codifica: 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)) @@ -76,15 +73,15 @@ class decodifica: if str(valore).isnumeric(): self.numero = valore else: - self.stringa = valore + self.stringa = valore.lower().replace(" ", "") def rot13(self): """ Cifrario ROT13 """ rotazione = str.maketrans( - "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + "nopqrstuvwxyzabcdefghijklm", + "abcdefghijklmnopqrstuvwxyz" ) return str.translate(self.stringa, rotazione) @@ -93,7 +90,6 @@ class decodifica: 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( @@ -101,7 +97,7 @@ class decodifica: ) return "".join(decifrata) - def gödel(self, primo, n): + def gödel(self, n, primo=2): """ Numero di Gödel Specificare un numero primo di partenza e @@ -110,10 +106,11 @@ class decodifica: 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]) + r, s = 0, self.numero + while s % i == 0: + r += 1 + s //= i + decifrata.append(alfa[r - 1 % 26]) return "".join(decifrata) def vernam(self, pad): @@ -121,7 +118,6 @@ class decodifica: 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( diff --git a/crittografia/numeri.py b/crittografia/numeri.py index fd57aa6..f126bbf 100644 --- a/crittografia/numeri.py +++ b/crittografia/numeri.py @@ -16,35 +16,39 @@ class primi: """ Test di primalità probabilistico Miller-Rabin. Restituisce True se n è primo altrimenti restituisce False. + La probabilità che sia sbagliato è 2^-2k """ + if n < 2 or n % 2 == 0: + return False if n == 2: return True - if n % 2 == 0: - return False - s = 0 - d = n - 1 - while True: - q, r = divmod(d, 2) - if r == 1: - break - s += 1 - d = q + r, s = 0, n - 1 + while s % 2 == 0: + r += 1 + s //= 2 for i in range(k): a = random.randrange(2, n) - if pow(a, d, n) == 1: - return True - for i in range(s): - if pow(a, 2 ** i * d, n) == n - 1: - return True - return False + x = pow(a, s, n) + if x == 1 or x == n - 1: + continue + for i in range(r - 1): + x = pow(x, 2, n) + if x == n - 1: + break + else: + return False + return True def primi(p, n): """ Restituisce gli n numeri primi succesivi a p. [Generatore] """ + if p == 2: + n -= 1 + yield p if p % 2 == 0: p += 1 i = 0 @@ -66,7 +70,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"] * + int(math.log(n)) + 500 + ) input.close() audio.terminate() dati = [i for i in dati if i != 0] diff --git a/crittografia/unicode.py b/crittografia/unicode.py index 6c2afac..94fcc05 100644 --- a/crittografia/unicode.py +++ b/crittografia/unicode.py @@ -35,7 +35,7 @@ class codifica: ) return "".join(cifrata) - def gödel(self, primo): + def gödel(self, primo=2): """ Numero di Gödel Specificare un numero primo di partenza. @@ -43,7 +43,7 @@ class codifica: cifrata = 1 sequenza = primi.primi(primo, len(self.stringa)) for i, lettera in enumerate(self.stringa): - cifrata *= next(sequenza) ** (ord(lettera) + 1) + cifrata *= next(sequenza) ** ord(lettera) return cifrata def vernam(self, pad=()): @@ -96,7 +96,7 @@ class decodifica: ) return "".join(decifrata) - def gödel(self, primo, n): + def gödel(self, n, primo=2): """ Numero di Gödel Specificare un numero primo di partenza e @@ -104,12 +104,12 @@ class decodifica: """ decifrata = [] for i in primi.primi(primo, n): - lettera = -1 - while self.numero % i == 0: - self.numero /= i - lettera += 1 - decifrata.append(chr(lettera % max)) - return decifrata + r, s = 0, self.numero + while s % i == 0: + r += 1 + s //= i + decifrata.append(chr(r % max)) + return "".join(decifrata) def vernam(self, pad): """