crypto/crittografia/alfabeto.py
Rnhmjoj e88bad83f8 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)
2013-12-09 22:20:36 +01:00

127 lines
2.7 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.lower().replace(" ", "")
def rot13(self):
"""
Cifrario ROT13
"""
rotazione = str.maketrans(
"abcdefghijklmnopqrstuvwxyz",
"nopqrstuvwxyzabcdefghijklm"
)
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)
"""
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=2):
"""
Numero di Gödel
Specificare un numero primo di partenza.
"""
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.
"""
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.lower().replace(" ", "")
def rot13(self):
"""
Cifrario ROT13
"""
rotazione = str.maketrans(
"nopqrstuvwxyzabcdefghijklm",
"abcdefghijklmnopqrstuvwxyz"
)
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
"""
Cifrario di vigenère
Fornire la chiave usata per crittografare la stringa. (verme)
"""
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, n, primo=2):
"""
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
r, s = 0, self.numero
while s % i == 0:
r += 1
s //= i
decifrata.append(alfa[r - 1 % 26])
return "".join(decifrata)
def vernam(self, pad):
"""
Cifrario di Vernam
Fornire il one-time-pad usato per crittografare la stringa.
"""
cifrata = []
for i, lettera in enumerate(self.stringa):
cifrata.append(
alfa[(ord[lettera] - pad[i]) % 26]
)
return "".join(cifrata)