916515e5e2
* 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
131 lines
3.0 KiB
Python
131 lines
3.0 KiB
Python
from .numeri import *
|
|
|
|
alfa = tuple("abcdefghijklmnopqrstuvwxyz")
|
|
ord = {k: i for i, k in enumerate(alfa)}
|
|
|
|
|
|
class codifica:
|
|
|
|
def __init__(self, valore):
|
|
"""
|
|
Inizializzazione
|
|
Fornire una stringa da crittografare.
|
|
"""
|
|
self.stringa = valore
|
|
|
|
def rot13(self):
|
|
"""
|
|
Cifrario ROT13
|
|
"""
|
|
rotazione = str.maketrans(
|
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
|
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
|
|
)
|
|
return str.translate(self.stringa, rotazione)
|
|
|
|
def vigenère(self, verme):
|
|
"""
|
|
Cifrario di vigenère
|
|
Fornire una chiave alfabetica di lunghezza
|
|
minore della stringa. (verme)
|
|
"""
|
|
self.stringa = self.stringa.lower().replace(" ", "")
|
|
cifrata = []
|
|
for i, lettera in enumerate(self.stringa):
|
|
cifrata.append(
|
|
alfa[(ord[lettera] + ord[verme[i % len(verme)]]) % 26]
|
|
)
|
|
return "".join(cifrata)
|
|
|
|
def gödel(self, primo):
|
|
"""
|
|
Numero di Gödel
|
|
Specificare un numero primo di partenza.
|
|
"""
|
|
self.stringa = self.stringa.lower().replace(" ", "")
|
|
cifrata = 1
|
|
sequenza = primi.primi(primo, len(self.stringa))
|
|
for i, lettera in enumerate(self.stringa):
|
|
cifrata *= next(sequenza) ** (ord[lettera] + 1)
|
|
return cifrata
|
|
|
|
def vernam(self, pad=()):
|
|
"""
|
|
Cifrario di Vernam
|
|
Se non si fornisce un one-time-pad ne viene generato
|
|
uno in automatico.
|
|
"""
|
|
self.stringa = self.stringa.lower().replace(" ", "")
|
|
cifrata = []
|
|
if pad is ():
|
|
pad = generatore.onetimepad(len(self.stringa))
|
|
for i, lettera in enumerate(self.stringa):
|
|
cifrata.append(
|
|
alfa[(ord[lettera] + pad[i]) % 26]
|
|
)
|
|
return "".join(cifrata), pad
|
|
|
|
|
|
class decodifica:
|
|
|
|
def __init__(self, valore):
|
|
"""
|
|
Inizializzazione
|
|
Fornire una stringa o un numero (di gödel) da decrittografare.
|
|
"""
|
|
if str(valore).isnumeric():
|
|
self.numero = valore
|
|
else:
|
|
self.stringa = valore
|
|
|
|
def rot13(self):
|
|
"""
|
|
Cifrario ROT13
|
|
"""
|
|
rotazione = str.maketrans(
|
|
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM",
|
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
)
|
|
return str.translate(self.stringa, rotazione)
|
|
|
|
def vigenère(self, verme):
|
|
"""
|
|
Cifrario di vigenère
|
|
Fornire la chiave usata per crittografare la stringa. (verme)
|
|
"""
|
|
self.stringa = self.stringa.lower().replace(" ", "")
|
|
decifrata = []
|
|
for i, lettera in enumerate(self.stringa):
|
|
decifrata.append(
|
|
alfa[(ord[lettera] - ord[verme[i % len(verme)]]) % 26]
|
|
)
|
|
return "".join(decifrata)
|
|
|
|
def gödel(self, primo, n):
|
|
"""
|
|
Numero di Gödel
|
|
Specificare un numero primo di partenza e
|
|
la lunghezza della stringa.
|
|
"""
|
|
decifrata = []
|
|
for i in primi.primi(primo, n):
|
|
lettera = -1
|
|
while self.numero % i == 0:
|
|
self.numero /= i
|
|
lettera += 1
|
|
decifrata.append(alfa[lettera % 26])
|
|
return "".join(decifrata)
|
|
|
|
def vernam(self, pad):
|
|
"""
|
|
Cifrario di Vernam
|
|
Fornire il one-time-pad usato per crittografare la stringa.
|
|
"""
|
|
self.stringa = self.stringa.lower().replace(" ", "")
|
|
cifrata = []
|
|
for i, lettera in enumerate(self.stringa):
|
|
cifrata.append(
|
|
alfa[(ord[lettera] - pad[i]) % 26]
|
|
)
|
|
return "".join(cifrata)
|