crypto/crittografia/unicode.py
2013-08-25 20:06:00 +02:00

117 lines
2.6 KiB
Python

from .numeri import *
max = 2 ** 16
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)
"""
cifrata = ""
for i, lettera in enumerate(self.stringa):
cifrata += chr((ord(lettera) + ord(verme[i % len(verme)])) % max)
return cifrata
def gödel(self, primo):
"""
Numero di Gödel
Specificare un numero primo di partenza.
"""
cifrata = 1
sequenza = primi.lista(primo, len(self.stringa))
for i, lettera in enumerate(self.stringa):
cifrata *= sequenza[i] ** (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 += chr((ord(lettera) + pad[i]) % max)
return 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)
"""
decifrata = ""
for i, lettera in enumerate(self.stringa):
decifrata += chr((ord(lettera) - ord(verme[i % len(verme)])) % max)
return 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.lista(primo, n):
lettera = -1
while self.numero % i == 0:
self.numero /= i
lettera += 1
decifrata += chr(lettera % max)
return 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 += chr((ord(lettera) - pad[i]) % max)
return cifrata