From ad9c548fc3a03e85793f2e449f0aa7a5a70ba1b3 Mon Sep 17 00:00:00 2001 From: Rnhmjoj Date: Sun, 4 Aug 2013 21:40:54 +0200 Subject: [PATCH] Aggiunte docstrings --- crittografia/alfabeto.py | 58 ++++++++++++++++++++++++++++++++------- crittografia/numeri.py | 29 ++++++++++++++++---- crittografia/unicode.py | 59 ++++++++++++++++++++++++++++++++-------- 3 files changed, 120 insertions(+), 26 deletions(-) diff --git a/crittografia/alfabeto.py b/crittografia/alfabeto.py index 039aa8a..89174d9 100644 --- a/crittografia/alfabeto.py +++ b/crittografia/alfabeto.py @@ -1,4 +1,4 @@ -from crittografia.numeri import * +from .numeri import * alfabeto = tuple("abcdefghijklmnopqrstuvwxyz") ordinale = dict([(k,i) for i,k in enumerate(alfabeto)]) @@ -6,13 +6,16 @@ ordinale = dict([(k,i) for i,k in enumerate(alfabeto)]) class codifica: def __init__(self, valore): - valore = str(valore) - if valore.isnumeric(): - self.numero = int(valore) - else: - self.stringa = valore + """ + Inizializzazione + Fornire una stringa da crittografare. + """ + self.stringa = valore def rot13(self): + """ + Cifrario ROT13 + """ rotazione = str.maketrans( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" @@ -20,6 +23,11 @@ class codifica: 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 in range(len(self.stringa)): @@ -27,6 +35,10 @@ class codifica: return 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.lista(primo, len(self.stringa)) @@ -35,6 +47,11 @@ class codifica: 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 (): @@ -46,11 +63,19 @@ class codifica: class decodifica: def __init__(self, valore): - valore = str(valore) - if valore.isnumeric(): self.numero = int(valore) - else: self.stringa = str(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" @@ -58,6 +83,10 @@ class decodifica: 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 in range(len(self.stringa)): @@ -65,6 +94,11 @@ class decodifica: return 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.lista(primo,n): lettera = -1 @@ -75,8 +109,12 @@ class decodifica: 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(" ","") cifrata = "" for i in range(len(self.stringa)): cifrata += alfabeto[(ordinale[self.stringa[i]] - pad[i]) % 26] - return cifrata \ No newline at end of file + return cifrata diff --git a/crittografia/numeri.py b/crittografia/numeri.py index f62cdf9..394e0cf 100644 --- a/crittografia/numeri.py +++ b/crittografia/numeri.py @@ -1,4 +1,5 @@ -import math, random, itertools, pyaudio +import math, random, itertools +import pyaudio opzioni = { "format": pyaudio.paFloat32, @@ -11,34 +12,52 @@ opzioni = { class primi: def primo(n): + """ + Restituisce True se n è primo altrimenti restituisce False. + """ for i in range(3, int(math.sqrt(n)) + 1,2): if n % i == 0: return False return True def prossimo(n): - if n % 2 == 0: n += 1 + """ + Restituisce il più piccolo numero primo maggiore di n. + [Generatore] + """ + if n % 2 == 0: + n += 1 while True: n += 2 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, stop): + def caso(inizio, fine, n): + """ + Restituisce n interi casuali nell'intervallo [inizio; fine). + [Generatore] + """ audio = pyaudio.PyAudio() input = audio.open(**opzioni) - dati = input.read(opzioni["rate"]//opzioni["frames_per_buffer"] * stop//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)] random.shuffle(dati) - for i in range(stop): + for i in range(n): yield dati[i] def onetimepad(l): + """ + Ritorna una l-tupla di interi casuali per un one-time-pad. + """ return tuple(generatore.caso(0,2*16,l)) diff --git a/crittografia/unicode.py b/crittografia/unicode.py index 596262c..2f569a1 100644 --- a/crittografia/unicode.py +++ b/crittografia/unicode.py @@ -1,16 +1,20 @@ -from crittografia.numeri import * +from .numeri import * max = 2**(16) class codifica: def __init__(self, valore): - valore = str(valore) - if valore.isnumeric(): - self.numero = int(valore) - else: self.stringa = valore + """ + Inizializzazione + Fornire una stringa da crittografare. + """ + self.stringa = valore def rot13(self): + """ + Cifrario ROT13 + """ rotazione = str.maketrans( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" @@ -18,12 +22,21 @@ class codifica: 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) + """ cifrata = "" for i in range(len(self.stringa)): cifrata += chr((ord(self.stringa[i]) + ord(verme[i % len(verme)])) % max) return cifrata def gödel(self, primo): + """ + Numero di Gödel + Specificare un numero primo di partenza. + """ cifrata = 1 sequenza = primi.lista(primo, len(self.stringa)) for i in range(len(self.stringa)): @@ -31,6 +44,11 @@ class codifica: return cifrata def vernam(self, pad=()): + """ + Cifrario di Vernam + Se non si fornisce un one-time-pad ne viene generato + uno in automatico. + """ cifrata = "" if pad is (): pad = generatore.onetimepad(len(self.stringa)) @@ -41,13 +59,19 @@ class codifica: class decodifica: def __init__(self, valore): - valore = str(valore) - if valore.isnumeric(): - self.numero = int(valore) - else: - self.stringa = str(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" @@ -55,12 +79,21 @@ class decodifica: 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) return 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.lista(primo,n): lettera = -1 @@ -71,6 +104,10 @@ class decodifica: 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)