diff --git a/Esempio.py b/Esempio.py index 21891f7..7e5deaa 100644 --- a/Esempio.py +++ b/Esempio.py @@ -1,6 +1,6 @@ -import crittografia +from crittografia.unicode import codifica -stringa = crittografia.unicode.codifica("Testo da cifrare.") +stringa = codifica("Testo da cifrare.") a = stringa.rot13() b = stringa.vigenère(verme = "verme") c = stringa.vernam() diff --git a/crittografia/alfabeto.py b/crittografia/alfabeto.py index f44a7ce..51bca56 100644 --- a/crittografia/alfabeto.py +++ b/crittografia/alfabeto.py @@ -2,9 +2,14 @@ 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 = valore - def rot13(self): rotazione = str.maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM") return str.translate(self.stringa, rotazione) def vigenère(self, verme): + if valore.isnumeric(): + self.numero = int(valore) + else: + self.stringa = 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, pad=()): self.stringa = self.stringa.lower().replace(" ","") cifrata = "" @@ -13,6 +18,9 @@ ordinale = dict([(k,i) for i,k in enumerate(alfabeto)]) class codifica: 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): + 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 index 1392585..c6a1d9f 100644 --- a/crittografia/numeri.py +++ b/crittografia/numeri.py @@ -1,11 +1,20 @@ -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(int(l*100/3)): output.write(chr(int(random.random() * 25 + 1))) output.close() audio.terminate() def leggirumore(inizio, fine, stop): +import math, random, itertools, pyaudio opzioni = { + "format": pyaudio.paFloat32, + "channels": 2, + "rate": 96000, + "input": True, + "frames_per_buffer": 1024 +} 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 caso(inizio, fine, stop): audio = pyaudio.PyAudio() - input = audio.open(format = pyaudio.paInt16, channels = 2, rate = 44100, input = True, frames_per_buffer = 1024) - dati = input.read(int(44100 / 1024 * stop * 10)) + input = audio.open(**opzioni) + dati = input.read(opzioni["rate"]//opzioni["frames_per_buffer"] * stop//2) input.close() audio.terminate() dati = [i for i in dati if i != 0] - numeri = [(i + random.randint(inizio,fine)) % (fine + abs(inizio)) + inizio for i in dati] + dati = [i for i in dati if i in range(inizio,fine)] + random.shuffle(dati) for i in range(stop): - yield numeri[i] - def onetimepad(l): return tuple(generatore.leggirumore(0,2*16,l)) \ No newline at end of file + yield dati[i] + def onetimepad(l): return tuple(generatore.caso(0,2*16,l)) diff --git a/crittografia/unicode.py b/crittografia/unicode.py index 3f88f1b..e1858c5 100644 --- a/crittografia/unicode.py +++ b/crittografia/unicode.py @@ -1,14 +1,22 @@ from crittografia.numeri import * max = 2**(16) class codifica: def __init__(self, valore): valore = str(valore) - if valore.isnumeric(): self.numero = int(valore) + if valore.isnumeric(): + self.numero = int(valore) else: self.stringa = 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, pad=()): cifrata = "" + 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, pad=()): cifrata = "" if pad is (): - pad = generatore.onetimepad(len(self.stringa)) - print(pad) for i in range(len(self.stringa)): cifrata += chr((ord(self.stringa[i]) + pad[i]) % max) return cifrata, pad class decodifica: + 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 + 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