Correzioni varie
* Completata corretamente la fattorizzazione dei numeri di Gödel * Corretto un errore nell’algoritmo del test di primalità * Corretto un un problema con l’input del microfono (lo stream si chiudeva prima di aver effetttivamente registrato)
This commit is contained in:
parent
916515e5e2
commit
e88bad83f8
@ -11,15 +11,15 @@ class codifica:
|
|||||||
Inizializzazione
|
Inizializzazione
|
||||||
Fornire una stringa da crittografare.
|
Fornire una stringa da crittografare.
|
||||||
"""
|
"""
|
||||||
self.stringa = valore
|
self.stringa = valore.lower().replace(" ", "")
|
||||||
|
|
||||||
def rot13(self):
|
def rot13(self):
|
||||||
"""
|
"""
|
||||||
Cifrario ROT13
|
Cifrario ROT13
|
||||||
"""
|
"""
|
||||||
rotazione = str.maketrans(
|
rotazione = str.maketrans(
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
"abcdefghijklmnopqrstuvwxyz",
|
||||||
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
|
"nopqrstuvwxyzabcdefghijklm"
|
||||||
)
|
)
|
||||||
return str.translate(self.stringa, rotazione)
|
return str.translate(self.stringa, rotazione)
|
||||||
|
|
||||||
@ -29,7 +29,6 @@ class codifica:
|
|||||||
Fornire una chiave alfabetica di lunghezza
|
Fornire una chiave alfabetica di lunghezza
|
||||||
minore della stringa. (verme)
|
minore della stringa. (verme)
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
|
||||||
cifrata = []
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata.append(
|
cifrata.append(
|
||||||
@ -37,12 +36,11 @@ class codifica:
|
|||||||
)
|
)
|
||||||
return "".join(cifrata)
|
return "".join(cifrata)
|
||||||
|
|
||||||
def gödel(self, primo):
|
def gödel(self, primo=2):
|
||||||
"""
|
"""
|
||||||
Numero di Gödel
|
Numero di Gödel
|
||||||
Specificare un numero primo di partenza.
|
Specificare un numero primo di partenza.
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
|
||||||
cifrata = 1
|
cifrata = 1
|
||||||
sequenza = primi.primi(primo, len(self.stringa))
|
sequenza = primi.primi(primo, len(self.stringa))
|
||||||
for i, lettera in enumerate(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
|
Se non si fornisce un one-time-pad ne viene generato
|
||||||
uno in automatico.
|
uno in automatico.
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
|
||||||
cifrata = []
|
cifrata = []
|
||||||
if pad is ():
|
if pad is ():
|
||||||
pad = generatore.onetimepad(len(self.stringa))
|
pad = generatore.onetimepad(len(self.stringa))
|
||||||
@ -76,15 +73,15 @@ class decodifica:
|
|||||||
if str(valore).isnumeric():
|
if str(valore).isnumeric():
|
||||||
self.numero = valore
|
self.numero = valore
|
||||||
else:
|
else:
|
||||||
self.stringa = valore
|
self.stringa = valore.lower().replace(" ", "")
|
||||||
|
|
||||||
def rot13(self):
|
def rot13(self):
|
||||||
"""
|
"""
|
||||||
Cifrario ROT13
|
Cifrario ROT13
|
||||||
"""
|
"""
|
||||||
rotazione = str.maketrans(
|
rotazione = str.maketrans(
|
||||||
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM",
|
"nopqrstuvwxyzabcdefghijklm",
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
)
|
)
|
||||||
return str.translate(self.stringa, rotazione)
|
return str.translate(self.stringa, rotazione)
|
||||||
|
|
||||||
@ -93,7 +90,6 @@ class decodifica:
|
|||||||
Cifrario di vigenère
|
Cifrario di vigenère
|
||||||
Fornire la chiave usata per crittografare la stringa. (verme)
|
Fornire la chiave usata per crittografare la stringa. (verme)
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
|
||||||
decifrata = []
|
decifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
decifrata.append(
|
decifrata.append(
|
||||||
@ -101,7 +97,7 @@ class decodifica:
|
|||||||
)
|
)
|
||||||
return "".join(decifrata)
|
return "".join(decifrata)
|
||||||
|
|
||||||
def gödel(self, primo, n):
|
def gödel(self, n, primo=2):
|
||||||
"""
|
"""
|
||||||
Numero di Gödel
|
Numero di Gödel
|
||||||
Specificare un numero primo di partenza e
|
Specificare un numero primo di partenza e
|
||||||
@ -110,10 +106,11 @@ class decodifica:
|
|||||||
decifrata = []
|
decifrata = []
|
||||||
for i in primi.primi(primo, n):
|
for i in primi.primi(primo, n):
|
||||||
lettera = -1
|
lettera = -1
|
||||||
while self.numero % i == 0:
|
r, s = 0, self.numero
|
||||||
self.numero /= i
|
while s % i == 0:
|
||||||
lettera += 1
|
r += 1
|
||||||
decifrata.append(alfa[lettera % 26])
|
s //= i
|
||||||
|
decifrata.append(alfa[r - 1 % 26])
|
||||||
return "".join(decifrata)
|
return "".join(decifrata)
|
||||||
|
|
||||||
def vernam(self, pad):
|
def vernam(self, pad):
|
||||||
@ -121,7 +118,6 @@ class decodifica:
|
|||||||
Cifrario di Vernam
|
Cifrario di Vernam
|
||||||
Fornire il one-time-pad usato per crittografare la stringa.
|
Fornire il one-time-pad usato per crittografare la stringa.
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
|
||||||
cifrata = []
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata.append(
|
cifrata.append(
|
||||||
|
@ -16,35 +16,39 @@ class primi:
|
|||||||
"""
|
"""
|
||||||
Test di primalità probabilistico Miller-Rabin.
|
Test di primalità probabilistico Miller-Rabin.
|
||||||
Restituisce True se n è primo altrimenti restituisce False.
|
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:
|
if n == 2:
|
||||||
return True
|
return True
|
||||||
if n % 2 == 0:
|
|
||||||
return False
|
|
||||||
|
|
||||||
s = 0
|
r, s = 0, n - 1
|
||||||
d = n - 1
|
while s % 2 == 0:
|
||||||
while True:
|
r += 1
|
||||||
q, r = divmod(d, 2)
|
s //= 2
|
||||||
if r == 1:
|
|
||||||
break
|
|
||||||
s += 1
|
|
||||||
d = q
|
|
||||||
|
|
||||||
for i in range(k):
|
for i in range(k):
|
||||||
a = random.randrange(2, n)
|
a = random.randrange(2, n)
|
||||||
if pow(a, d, n) == 1:
|
x = pow(a, s, n)
|
||||||
return True
|
if x == 1 or x == n - 1:
|
||||||
for i in range(s):
|
continue
|
||||||
if pow(a, 2 ** i * d, n) == n - 1:
|
for i in range(r - 1):
|
||||||
return True
|
x = pow(x, 2, n)
|
||||||
|
if x == n - 1:
|
||||||
|
break
|
||||||
|
else:
|
||||||
return False
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def primi(p, n):
|
def primi(p, n):
|
||||||
"""
|
"""
|
||||||
Restituisce gli n numeri primi succesivi a p.
|
Restituisce gli n numeri primi succesivi a p.
|
||||||
[Generatore]
|
[Generatore]
|
||||||
"""
|
"""
|
||||||
|
if p == 2:
|
||||||
|
n -= 1
|
||||||
|
yield p
|
||||||
if p % 2 == 0:
|
if p % 2 == 0:
|
||||||
p += 1
|
p += 1
|
||||||
i = 0
|
i = 0
|
||||||
@ -66,7 +70,11 @@ class generatore:
|
|||||||
"""
|
"""
|
||||||
audio = pyaudio.PyAudio()
|
audio = pyaudio.PyAudio()
|
||||||
input = audio.open(**opzioni)
|
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()
|
input.close()
|
||||||
audio.terminate()
|
audio.terminate()
|
||||||
dati = [i for i in dati if i != 0]
|
dati = [i for i in dati if i != 0]
|
||||||
|
@ -35,7 +35,7 @@ class codifica:
|
|||||||
)
|
)
|
||||||
return "".join(cifrata)
|
return "".join(cifrata)
|
||||||
|
|
||||||
def gödel(self, primo):
|
def gödel(self, primo=2):
|
||||||
"""
|
"""
|
||||||
Numero di Gödel
|
Numero di Gödel
|
||||||
Specificare un numero primo di partenza.
|
Specificare un numero primo di partenza.
|
||||||
@ -43,7 +43,7 @@ class codifica:
|
|||||||
cifrata = 1
|
cifrata = 1
|
||||||
sequenza = primi.primi(primo, len(self.stringa))
|
sequenza = primi.primi(primo, len(self.stringa))
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata *= next(sequenza) ** (ord(lettera) + 1)
|
cifrata *= next(sequenza) ** ord(lettera)
|
||||||
return cifrata
|
return cifrata
|
||||||
|
|
||||||
def vernam(self, pad=()):
|
def vernam(self, pad=()):
|
||||||
@ -96,7 +96,7 @@ class decodifica:
|
|||||||
)
|
)
|
||||||
return "".join(decifrata)
|
return "".join(decifrata)
|
||||||
|
|
||||||
def gödel(self, primo, n):
|
def gödel(self, n, primo=2):
|
||||||
"""
|
"""
|
||||||
Numero di Gödel
|
Numero di Gödel
|
||||||
Specificare un numero primo di partenza e
|
Specificare un numero primo di partenza e
|
||||||
@ -104,12 +104,12 @@ class decodifica:
|
|||||||
"""
|
"""
|
||||||
decifrata = []
|
decifrata = []
|
||||||
for i in primi.primi(primo, n):
|
for i in primi.primi(primo, n):
|
||||||
lettera = -1
|
r, s = 0, self.numero
|
||||||
while self.numero % i == 0:
|
while s % i == 0:
|
||||||
self.numero /= i
|
r += 1
|
||||||
lettera += 1
|
s //= i
|
||||||
decifrata.append(chr(lettera % max))
|
decifrata.append(chr(r % max))
|
||||||
return decifrata
|
return "".join(decifrata)
|
||||||
|
|
||||||
def vernam(self, pad):
|
def vernam(self, pad):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user