crypto/crittografia/alfabeto.py

123 lines
3.0 KiB
Python
Raw Normal View History

2013-08-04 21:40:54 +02:00
from .numeri import *
2013-07-15 15:34:50 +02:00
alfabeto = tuple("abcdefghijklmnopqrstuvwxyz")
2013-08-25 20:06:00 +02:00
ordinale = dict([(k, i) for i, k in enumerate(alfabeto)])
2013-07-15 15:34:50 +02:00
class codifica:
2013-08-25 20:06:00 +02:00
2012-12-25 23:19:52 +01:00
def __init__(self, valore):
2013-08-04 21:40:54 +02:00
"""
Inizializzazione
Fornire una stringa da crittografare.
"""
self.stringa = valore
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def rot13(self):
2013-08-04 21:40:54 +02:00
"""
Cifrario ROT13
"""
2013-07-15 15:34:50 +02:00
rotazione = str.maketrans(
2013-08-25 20:06:00 +02:00
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
2013-07-15 15:34:50 +02:00
)
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
2013-08-04 21:40:54 +02:00
"""
Cifrario di vigenère
2013-08-25 20:06:00 +02:00
Fornire una chiave alfabetica di lunghezza
2013-08-04 21:40:54 +02:00
minore della stringa. (verme)
"""
2013-08-25 20:06:00 +02:00
self.stringa = self.stringa.lower().replace(" ", "")
2013-07-15 15:34:50 +02:00
cifrata = ""
2013-08-25 20:06:00 +02:00
for i, lettera in enumerate(self.stringa):
cifrata += alfabeto[(ordinale[lettera] + ordinale[verme[i % len(verme)]]) % 26]
2013-07-15 15:34:50 +02:00
return cifrata
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def gödel(self, primo):
2013-08-04 21:40:54 +02:00
"""
Numero di Gödel
Specificare un numero primo di partenza.
"""
2013-08-25 20:06:00 +02:00
self.stringa = self.stringa.lower().replace(" ", "")
2013-07-15 15:34:50 +02:00
cifrata = 1
sequenza = primi.lista(primo, len(self.stringa))
2013-08-25 20:06:00 +02:00
for i, lettera in enumerate(self.stringa):
cifrata *= sequenza[i] ** (ordinale[lettera] + 1)
return cifrata
2013-07-15 15:34:50 +02:00
def vernam(self, pad=()):
2013-08-04 21:40:54 +02:00
"""
Cifrario di Vernam
Se non si fornisce un one-time-pad ne viene generato
uno in automatico.
"""
2013-08-25 20:06:00 +02:00
self.stringa = self.stringa.lower().replace(" ", "")
2013-07-15 15:34:50 +02:00
cifrata = ""
if pad is ():
pad = generatore.onetimepad(len(self.stringa))
2013-08-25 20:06:00 +02:00
for i, lettera in enumerate(self.stringa):
cifrata += alfabeto[(ordinale[lettera] + pad[i]) % 26]
2013-07-15 15:34:50 +02:00
return cifrata, pad
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
class decodifica:
2013-08-25 20:06:00 +02:00
2012-12-25 23:19:52 +01:00
def __init__(self, valore):
2013-08-04 21:40:54 +02:00
"""
Inizializzazione
Fornire una stringa o un numero (di gödel) da decrittografare.
"""
2013-08-25 20:06:00 +02:00
if str(valore).isnumeric():
2013-08-04 21:40:54 +02:00
self.numero = valore
2013-08-25 20:06:00 +02:00
else:
self.stringa = valore
2013-07-15 15:34:50 +02:00
def rot13(self):
2013-08-04 21:40:54 +02:00
"""
Cifrario ROT13
"""
2013-07-15 15:34:50 +02:00
rotazione = str.maketrans(
2013-08-25 20:06:00 +02:00
"nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM",
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
2013-07-15 15:34:50 +02:00
)
return str.translate(self.stringa, rotazione)
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def vigenère(self, verme):
2013-08-04 21:40:54 +02:00
"""
Cifrario di vigenère
Fornire la chiave usata per crittografare la stringa. (verme)
"""
2013-08-25 20:06:00 +02:00
self.stringa = self.stringa.lower().replace(" ", "")
2013-07-15 15:34:50 +02:00
decifrata = ""
2013-08-25 20:06:00 +02:00
for i, lettera in enumerate(self.stringa):
decifrata += (alfabeto[(ordinale[lettera] - ordinale[verme[i % len(verme)]]) % 26])
2013-07-15 15:34:50 +02:00
return decifrata
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def gödel(self, primo, n):
2013-08-04 21:40:54 +02:00
"""
Numero di Gödel
2013-08-25 20:06:00 +02:00
Specificare un numero primo di partenza e
2013-08-04 21:40:54 +02:00
la lunghezza della stringa.
"""
2013-07-15 15:34:50 +02:00
decifrata = ""
2013-08-25 20:06:00 +02:00
for i in primi.lista(primo, n):
2013-07-15 15:34:50 +02:00
lettera = -1
while self.numero % i == 0:
self.numero /= i
lettera += 1
2013-08-25 20:06:00 +02:00
decifrata += alfabeto[lettera % 26]
2013-07-15 15:34:50 +02:00
return decifrata
2013-08-25 20:06:00 +02:00
2013-07-15 15:34:50 +02:00
def vernam(self, pad):
2013-08-04 21:40:54 +02:00
"""
Cifrario di Vernam
Fornire il one-time-pad usato per crittografare la stringa.
"""
2013-08-25 20:06:00 +02:00
self.stringa = self.stringa.lower().replace(" ", "")
2013-07-15 15:34:50 +02:00
cifrata = ""
2013-08-25 20:06:00 +02:00
for i, lettera in enumerate(self.stringa):
cifrata += alfabeto[(ordinale[lettera] - pad[i]) % 26]
2013-08-04 21:40:54 +02:00
return cifrata