From 3068206271288330e680c4459ae664a4d8a0dafd Mon Sep 17 00:00:00 2001 From: Rnhmjoj Date: Tue, 25 Dec 2012 23:19:52 +0100 Subject: [PATCH] Commit Iniziale --- .gitignore | 1 + Esempio.py | 9 +++++++++ License.txt | 14 ++++++++++++++ README.md | 36 ++++++++++++++++++++++++++++++++++++ crittografia/__init__.py | 3 +++ crittografia/alfabeto.py | 17 +++++++++++++++++ crittografia/numeri.py | 1 + crittografia/unicode.py | 11 +++++++++++ 8 files changed, 92 insertions(+) create mode 100644 .gitignore create mode 100644 Esempio.py create mode 100644 License.txt create mode 100644 README.md create mode 100644 crittografia/__init__.py create mode 100644 crittografia/alfabeto.py create mode 100644 crittografia/numeri.py create mode 100644 crittografia/unicode.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/Esempio.py b/Esempio.py new file mode 100644 index 0000000..95ee82e --- /dev/null +++ b/Esempio.py @@ -0,0 +1,9 @@ +import crittografia + +stringa = crittografia.unicode.codifica("Testo da cifrare.") +b = stringa.rot13() +a = stringa.vigenère(verme = "verme") +c = stringa.vernam() +d = stringa.gödel(primo = 1117) + +print(a, b, c, d, sep = "\n - ") diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..9f7b661 --- /dev/null +++ b/License.txt @@ -0,0 +1,14 @@ + * Minimal Autoindex + * + * Tema per il directory listing di Apache. + * + * Le icone incluse appartengono a FatCow Web Hosting e a + * Yusuke Kamiyamane, distribuite sotto licenza CC attribution 3.0. + * http://creativecommons.org/licenses/by/3.0/legalcode + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * @author Michele Guerini Rocco aka Rnhmjoj + * @since 2012 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..aa86aee --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +Crittografia +============ + +Pacchetto di funzioni crittografiche in python 3 +------------------------------------------------ + +### Informazioni +Una raccolta di cifrari storici e famosi in python. +Per ora contiene: +* ROT13; +* Cifrario di Vigenère; +* Cifrario di Vernam +* Numero di Gödel + +Si può scegliere se codificare solo lettere dell'alfabeto, caratteri ASCII o unicode UTF-8 a seconda del modulo che si importa. + +È in grado di generare un onetimepad per il cifrario di Vernam con numeri casuali veri dal microfono tramite il modulo pyaudio. +Se non è già installato si può scaricare da quì: http://people.csail.mit.edu/hubert/pyaudio/ + +### Istruzioni +Codifica: + + *.rot13(stringa): stringa da codificare; + *.vigenère(stringa,verme): stringa da codificare e verme(chiave di codifica); + *.vernam(stringa): stringa da codificare; + *.gödel(stringa,primo): stringa da codificare e un numero primo(è consigliabile di alcune migliaia di cifre); + +Decodifica: + + *.rot13(stringa): stringa codificata; + *.vigenère(stringa,verme): stringa codificata e verme(chiave di codifica); + *.vernam(stringa,pad): stringa codificata e il onetimepad in una tupla; + *.gödel(stringa,primo,n): stringa codificata, numero primo e lunghezza della stringa decodificata; + +### Utilizzo +Nel file "Esempio.py" c'è un esempio di utilizzo di ogni funzione. \ No newline at end of file diff --git a/crittografia/__init__.py b/crittografia/__init__.py new file mode 100644 index 0000000..2ecfe2e --- /dev/null +++ b/crittografia/__init__.py @@ -0,0 +1,3 @@ +from .alfabeto import * +from .unicode import * +from .alfabeto import * \ No newline at end of file diff --git a/crittografia/alfabeto.py b/crittografia/alfabeto.py new file mode 100644 index 0000000..3b3ab61 --- /dev/null +++ b/crittografia/alfabeto.py @@ -0,0 +1,17 @@ +from crittografia.numeri import * alfabeto = tuple("abcdefghijklmnopqrstuvwxyz") +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 = str(valore) + def rot13(self): rotazione = str.maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM") return str.translate(self.stringa, rotazione) def vigenère(self, verme): + 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] return cifrata def gödel(self, primo): + 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 def vernam(self): + self.stringa = self.stringa.lower().replace(" ","") cifrata = "" pad = generatore.onetimepad(len(self.stringa)) for i in range(len(self.stringa)): cifrata += alfabeto[(ordinale[self.stringa[i]] + pad[i]) % 26] return cifrata, pad class decodifica: + def __init__(self, valore): + valore = str(valore) + if valore.isnumeric(): self.numero = int(valore) + else: self.stringa = str(valore) + def rot13(self): rotazione = str.maketrans("nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") return str.translate(self.stringa, rotazione) def vigenère(self, verme): + 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]) return decifrata def gödel(self, primo, n): decifrata = "" for i in primi.lista(primo,n): lettera = -1 while self.numero % i == 0: self.numero /= i lettera += 1 decifrata += alfabeto[lettera % 26] return decifrata def vernam(self, pad): + 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 diff --git a/crittografia/numeri.py b/crittografia/numeri.py new file mode 100644 index 0000000..e6362f9 --- /dev/null +++ b/crittografia/numeri.py @@ -0,0 +1 @@ +import math,random,itertools,pyaudio class primi: def primo(n): 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 while True: n += 2 if primi.primo(n): yield n def lista(p, n): return tuple([p for p in itertools.islice(primi.prossimo(p), n)]) class generatore: def rumore(l): audio = pyaudio.PyAudio() output = audio.open(format = pyaudio.paInt8, channels = 1, output=True, rate = 50000) for i in range(l*2500): output.write(chr(int(random.random() * 25 + 1))) output.close() audio.terminate() def leggirumore(l): audio = pyaudio.PyAudio() input = audio.open(format = pyaudio.paInt16, channels = 2, rate = 44100, input = True, frames_per_buffer = 1024) return bytes(input.read(int(44100 / 1024 * l * 10))) input.close() audio.terminate() def onetimepad(l): dati = generatore.leggirumore(l) numeri = [int(dati[i] * random.random() * l) for i in range(len(dati)) if dati[i] != 0] inizio = int(random.random()*l) return tuple([numeri[i] for i in range(inizio, inizio + l)]) \ No newline at end of file diff --git a/crittografia/unicode.py b/crittografia/unicode.py new file mode 100644 index 0000000..a584216 --- /dev/null +++ b/crittografia/unicode.py @@ -0,0 +1,11 @@ +from crittografia.numeri import * max = 2**(32) class codifica: + def __init__(self, valore): + valore = str(valore) + if valore.isnumeric(): self.numero = int(valore) + else: self.stringa = str(valore) + def rot13(self): rotazione = str.maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM") return str.translate(self.stringa, rotazione) def vigenère(self, 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): cifrata = 1 sequenza = primi.lista(primo, len(self.stringa)) for i in range(len(self.stringa)): cifrata *= sequenza[i]**(ord(self.stringa[i]) + 1) return cifrata def vernam(self): cifrata = "" pad = generatore.onetimepad(len(self.stringa)) for i in range(len(self.stringa)): cifrata += chr((ord(self.stringa[i]) + pad[i]) % max) return cifrata, pad class decodifica: + def __init__(self, valore): + valore = str(valore) + if valore.isnumeric(): self.numero = int(valore) + else: self.stringa = str(valore) + def rot13(self): rotazione = str.maketrans("nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") return str.translate(self.stringa, rotazione) def vigenère(self, 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): decifrata = "" 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): cifrata = "" for i in range(len(self.stringa)): cifrata += chr((ord(self.stringa[i]) - pad[i]) % max) return cifrata \ No newline at end of file