Miglioramenti vari
* Sostituito il test di primalità con il Miller-Rabin (k=64) (più veloce ma non deterministico) * Utlizzati generatori in sostituzione alle tuple (più veloce) * Sostituita la concatenazione di stringhe con join (più veloce) * Correzioni per PEP8
This commit is contained in:
parent
73cabc2f8b
commit
916515e5e2
@ -1,6 +1,6 @@
|
|||||||
* Crittografia
|
* Crittografia
|
||||||
*
|
*
|
||||||
* Pacchetto di funzioni crittografiche in python 3
|
* Pacchetto di cifrari storici e famosi in python 3
|
||||||
*
|
*
|
||||||
* Dual licensed under the MIT and GPL licenses:
|
* Dual licensed under the MIT and GPL licenses:
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
Crittografia
|
# Crittografia
|
||||||
============
|
|
||||||
|
|
||||||
Pacchetto di funzioni crittografiche in python 3
|
|
||||||
------------------------------------------------
|
## Pacchetto di cifrari storici e famosi in python 3
|
||||||
|
|
||||||
### Informazioni
|
### Informazioni
|
||||||
Una raccolta di cifrari storici e famosi in python.
|
Una raccolta di cifrari storici e famosi in python 3.
|
||||||
Per ora contiene:
|
Per ora contiene:
|
||||||
* ROT13;
|
* ROT13;
|
||||||
* Cifrario di Vigenère;
|
* Cifrario di Vigenère;
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
from .alfabeto import *
|
from .alfabeto import *
|
||||||
from .unicode import *
|
from .unicode import *
|
||||||
from .numeri import *
|
from .numeri import *
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from .numeri import *
|
from .numeri import *
|
||||||
|
|
||||||
alfabeto = tuple("abcdefghijklmnopqrstuvwxyz")
|
alfa = tuple("abcdefghijklmnopqrstuvwxyz")
|
||||||
ordinale = dict([(k, i) for i, k in enumerate(alfabeto)])
|
ord = {k: i for i, k in enumerate(alfa)}
|
||||||
|
|
||||||
|
|
||||||
class codifica:
|
class codifica:
|
||||||
@ -30,10 +30,12 @@ class codifica:
|
|||||||
minore della stringa. (verme)
|
minore della stringa. (verme)
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
self.stringa = self.stringa.lower().replace(" ", "")
|
||||||
cifrata = ""
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += alfabeto[(ordinale[lettera] + ordinale[verme[i % len(verme)]]) % 26]
|
cifrata.append(
|
||||||
return cifrata
|
alfa[(ord[lettera] + ord[verme[i % len(verme)]]) % 26]
|
||||||
|
)
|
||||||
|
return "".join(cifrata)
|
||||||
|
|
||||||
def gödel(self, primo):
|
def gödel(self, primo):
|
||||||
"""
|
"""
|
||||||
@ -42,9 +44,9 @@ class codifica:
|
|||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
self.stringa = self.stringa.lower().replace(" ", "")
|
||||||
cifrata = 1
|
cifrata = 1
|
||||||
sequenza = primi.lista(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 *= sequenza[i] ** (ordinale[lettera] + 1)
|
cifrata *= next(sequenza) ** (ord[lettera] + 1)
|
||||||
return cifrata
|
return cifrata
|
||||||
|
|
||||||
def vernam(self, pad=()):
|
def vernam(self, pad=()):
|
||||||
@ -54,12 +56,14 @@ class codifica:
|
|||||||
uno in automatico.
|
uno in automatico.
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
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))
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += alfabeto[(ordinale[lettera] + pad[i]) % 26]
|
cifrata.append(
|
||||||
return cifrata, pad
|
alfa[(ord[lettera] + pad[i]) % 26]
|
||||||
|
)
|
||||||
|
return "".join(cifrata), pad
|
||||||
|
|
||||||
|
|
||||||
class decodifica:
|
class decodifica:
|
||||||
@ -90,10 +94,12 @@ class decodifica:
|
|||||||
Fornire la chiave usata per crittografare la stringa. (verme)
|
Fornire la chiave usata per crittografare la stringa. (verme)
|
||||||
"""
|
"""
|
||||||
self.stringa = self.stringa.lower().replace(" ", "")
|
self.stringa = self.stringa.lower().replace(" ", "")
|
||||||
decifrata = ""
|
decifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
decifrata += (alfabeto[(ordinale[lettera] - ordinale[verme[i % len(verme)]]) % 26])
|
decifrata.append(
|
||||||
return decifrata
|
alfa[(ord[lettera] - ord[verme[i % len(verme)]]) % 26]
|
||||||
|
)
|
||||||
|
return "".join(decifrata)
|
||||||
|
|
||||||
def gödel(self, primo, n):
|
def gödel(self, primo, n):
|
||||||
"""
|
"""
|
||||||
@ -101,14 +107,14 @@ class decodifica:
|
|||||||
Specificare un numero primo di partenza e
|
Specificare un numero primo di partenza e
|
||||||
la lunghezza della stringa.
|
la lunghezza della stringa.
|
||||||
"""
|
"""
|
||||||
decifrata = ""
|
decifrata = []
|
||||||
for i in primi.lista(primo, n):
|
for i in primi.primi(primo, n):
|
||||||
lettera = -1
|
lettera = -1
|
||||||
while self.numero % i == 0:
|
while self.numero % i == 0:
|
||||||
self.numero /= i
|
self.numero /= i
|
||||||
lettera += 1
|
lettera += 1
|
||||||
decifrata += alfabeto[lettera % 26]
|
decifrata.append(alfa[lettera % 26])
|
||||||
return decifrata
|
return "".join(decifrata)
|
||||||
|
|
||||||
def vernam(self, pad):
|
def vernam(self, pad):
|
||||||
"""
|
"""
|
||||||
@ -116,7 +122,9 @@ class decodifica:
|
|||||||
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(" ", "")
|
self.stringa = self.stringa.lower().replace(" ", "")
|
||||||
cifrata = ""
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += alfabeto[(ordinale[lettera] - pad[i]) % 26]
|
cifrata.append(
|
||||||
return cifrata
|
alfa[(ord[lettera] - pad[i]) % 26]
|
||||||
|
)
|
||||||
|
return "".join(cifrata)
|
||||||
|
@ -12,32 +12,49 @@ opzioni = {
|
|||||||
|
|
||||||
class primi:
|
class primi:
|
||||||
|
|
||||||
def primo(n):
|
def primo(n, k=64):
|
||||||
"""
|
"""
|
||||||
|
Test di primalità probabilistico Miller-Rabin.
|
||||||
Restituisce True se n è primo altrimenti restituisce False.
|
Restituisce True se n è primo altrimenti restituisce False.
|
||||||
"""
|
"""
|
||||||
for i in range(3, int(math.sqrt(n)) + 1, 2):
|
if n == 2:
|
||||||
if n % i == 0:
|
return True
|
||||||
return False
|
if n % 2 == 0:
|
||||||
return True
|
return False
|
||||||
|
|
||||||
def prossimo(n):
|
s = 0
|
||||||
|
d = n - 1
|
||||||
|
while True:
|
||||||
|
q, r = divmod(d, 2)
|
||||||
|
if r == 1:
|
||||||
|
break
|
||||||
|
s += 1
|
||||||
|
d = q
|
||||||
|
|
||||||
|
for i in range(k):
|
||||||
|
a = random.randrange(2, n)
|
||||||
|
if pow(a, d, n) == 1:
|
||||||
|
return True
|
||||||
|
for i in range(s):
|
||||||
|
if pow(a, 2 ** i * d, n) == n - 1:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def primi(p, n):
|
||||||
"""
|
"""
|
||||||
Restituisce il più piccolo numero primo maggiore di n.
|
Restituisce gli n numeri primi succesivi a p.
|
||||||
[Generatore]
|
[Generatore]
|
||||||
"""
|
"""
|
||||||
if n % 2 == 0:
|
if p % 2 == 0:
|
||||||
n += 1
|
p += 1
|
||||||
|
i = 0
|
||||||
while True:
|
while True:
|
||||||
n += 2
|
if i == n:
|
||||||
if primi.primo(n):
|
break
|
||||||
yield n
|
if primi.primo(p):
|
||||||
|
i += 1
|
||||||
def lista(p, n):
|
yield p
|
||||||
"""
|
p += 2
|
||||||
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:
|
class generatore:
|
||||||
|
@ -28,10 +28,12 @@ class codifica:
|
|||||||
Fornire una chiave alfabetica di lunghezza
|
Fornire una chiave alfabetica di lunghezza
|
||||||
minore della stringa. (verme)
|
minore della stringa. (verme)
|
||||||
"""
|
"""
|
||||||
cifrata = ""
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += chr((ord(lettera) + ord(verme[i % len(verme)])) % max)
|
cifrata.append(
|
||||||
return cifrata
|
chr((ord(lettera) + ord(verme[i % len(verme)])) % max)
|
||||||
|
)
|
||||||
|
return "".join(cifrata)
|
||||||
|
|
||||||
def gödel(self, primo):
|
def gödel(self, primo):
|
||||||
"""
|
"""
|
||||||
@ -39,9 +41,9 @@ class codifica:
|
|||||||
Specificare un numero primo di partenza.
|
Specificare un numero primo di partenza.
|
||||||
"""
|
"""
|
||||||
cifrata = 1
|
cifrata = 1
|
||||||
sequenza = primi.lista(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 *= sequenza[i] ** (ord(lettera) + 1)
|
cifrata *= next(sequenza) ** (ord(lettera) + 1)
|
||||||
return cifrata
|
return cifrata
|
||||||
|
|
||||||
def vernam(self, pad=()):
|
def vernam(self, pad=()):
|
||||||
@ -50,12 +52,14 @@ 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.
|
||||||
"""
|
"""
|
||||||
cifrata = ""
|
cifrata = []
|
||||||
if pad is ():
|
if pad is ():
|
||||||
pad = generatore.onetimepad(len(self.stringa))
|
pad = generatore.onetimepad(len(self.stringa))
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += chr((ord(lettera) + pad[i]) % max)
|
cifrata.append(
|
||||||
return cifrata, pad
|
chr((ord(lettera) + pad[i]) % max)
|
||||||
|
)
|
||||||
|
return "".join(cifrata), pad
|
||||||
|
|
||||||
|
|
||||||
class decodifica:
|
class decodifica:
|
||||||
@ -85,10 +89,12 @@ 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)
|
||||||
"""
|
"""
|
||||||
decifrata = ""
|
decifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
decifrata += chr((ord(lettera) - ord(verme[i % len(verme)])) % max)
|
decifrata.append(
|
||||||
return decifrata
|
chr((ord(lettera) - ord(verme[i % len(verme)])) % max)
|
||||||
|
)
|
||||||
|
return "".join(decifrata)
|
||||||
|
|
||||||
def gödel(self, primo, n):
|
def gödel(self, primo, n):
|
||||||
"""
|
"""
|
||||||
@ -96,13 +102,13 @@ class decodifica:
|
|||||||
Specificare un numero primo di partenza e
|
Specificare un numero primo di partenza e
|
||||||
la lunghezza della stringa.
|
la lunghezza della stringa.
|
||||||
"""
|
"""
|
||||||
decifrata = ""
|
decifrata = []
|
||||||
for i in primi.lista(primo, n):
|
for i in primi.primi(primo, n):
|
||||||
lettera = -1
|
lettera = -1
|
||||||
while self.numero % i == 0:
|
while self.numero % i == 0:
|
||||||
self.numero /= i
|
self.numero /= i
|
||||||
lettera += 1
|
lettera += 1
|
||||||
decifrata += chr(lettera % max)
|
decifrata.append(chr(lettera % max))
|
||||||
return decifrata
|
return decifrata
|
||||||
|
|
||||||
def vernam(self, pad):
|
def vernam(self, pad):
|
||||||
@ -110,7 +116,9 @@ 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.
|
||||||
"""
|
"""
|
||||||
cifrata = ""
|
cifrata = []
|
||||||
for i, lettera in enumerate(self.stringa):
|
for i, lettera in enumerate(self.stringa):
|
||||||
cifrata += chr((ord(lettera) - pad[i]) % max)
|
cifrata.append(
|
||||||
return cifrata
|
chr((ord(lettera) - pad[i]) % max)
|
||||||
|
)
|
||||||
|
return "".join(cifrata)
|
||||||
|
Loading…
Reference in New Issue
Block a user