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:
Rnhmjoj 2013-12-09 22:20:36 +01:00
parent 916515e5e2
commit e88bad83f8
3 changed files with 47 additions and 43 deletions

View File

@ -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(

View File

@ -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)
return False if x == n - 1:
break
else:
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]

View File

@ -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):
""" """