Commit Iniziale
This commit is contained in:
commit
3068206271
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.DS_Store
|
9
Esempio.py
Normal file
9
Esempio.py
Normal file
@ -0,0 +1,9 @@
|
||||
import crittografia
|
||||
|
||||
stringa = crittografia.unicode.codifica("Testo da cifrare.")
|
||||
b = stringa.rot13()
|
||||
a = stringa.vigenère(verme = "verme")
|
||||
c = stringa.vernam()
|
||||
d = stringa.gödel(primo = 1117)
|
||||
|
||||
print(a, b, c, d, sep = "\n - ")
|
14
License.txt
Normal file
14
License.txt
Normal file
@ -0,0 +1,14 @@
|
||||
* Minimal Autoindex
|
||||
*
|
||||
* Tema per il directory listing di Apache.
|
||||
*
|
||||
* Le icone incluse appartengono a FatCow Web Hosting e a
|
||||
* Yusuke Kamiyamane, distribuite sotto licenza CC attribution 3.0.
|
||||
* http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* @author Michele Guerini Rocco aka Rnhmjoj
|
||||
* @since 2012
|
36
README.md
Normal file
36
README.md
Normal file
@ -0,0 +1,36 @@
|
||||
Crittografia
|
||||
============
|
||||
|
||||
Pacchetto di funzioni crittografiche in python 3
|
||||
------------------------------------------------
|
||||
|
||||
### Informazioni
|
||||
Una raccolta di cifrari storici e famosi in python.
|
||||
Per ora contiene:
|
||||
* ROT13;
|
||||
* Cifrario di Vigenère;
|
||||
* Cifrario di Vernam
|
||||
* Numero di Gödel
|
||||
|
||||
Si può scegliere se codificare solo lettere dell'alfabeto, caratteri ASCII o unicode UTF-8 a seconda del modulo che si importa.
|
||||
|
||||
È in grado di generare un onetimepad per il cifrario di Vernam con numeri casuali veri dal microfono tramite il modulo pyaudio.
|
||||
Se non è già installato si può scaricare da quì: http://people.csail.mit.edu/hubert/pyaudio/
|
||||
|
||||
### Istruzioni
|
||||
Codifica:
|
||||
|
||||
*.rot13(stringa): stringa da codificare;
|
||||
*.vigenère(stringa,verme): stringa da codificare e verme(chiave di codifica);
|
||||
*.vernam(stringa): stringa da codificare;
|
||||
*.gödel(stringa,primo): stringa da codificare e un numero primo(è consigliabile di alcune migliaia di cifre);
|
||||
|
||||
Decodifica:
|
||||
|
||||
*.rot13(stringa): stringa codificata;
|
||||
*.vigenère(stringa,verme): stringa codificata e verme(chiave di codifica);
|
||||
*.vernam(stringa,pad): stringa codificata e il onetimepad in una tupla;
|
||||
*.gödel(stringa,primo,n): stringa codificata, numero primo e lunghezza della stringa decodificata;
|
||||
|
||||
### Utilizzo
|
||||
Nel file "Esempio.py" c'è un esempio di utilizzo di ogni funzione.
|
3
crittografia/__init__.py
Normal file
3
crittografia/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
from .alfabeto import *
|
||||
from .unicode import *
|
||||
from .alfabeto import *
|
17
crittografia/alfabeto.py
Normal file
17
crittografia/alfabeto.py
Normal file
@ -0,0 +1,17 @@
|
||||
from crittografia.numeri import *
alfabeto = tuple("abcdefghijklmnopqrstuvwxyz")
|
||||
ordinale = dict([(k,i) for i,k in enumerate(alfabeto)])
class codifica:
|
||||
def __init__(self, valore):
|
||||
valore = str(valore)
|
||||
if valore.isnumeric(): self.numero = int(valore)
|
||||
else: self.stringa = str(valore)
|
||||
def rot13(self):
rotazione = str.maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
|
||||
self.stringa = self.stringa.lower().replace(" ","")
cifrata = ""
for i in range(len(self.stringa)):
cifrata += alfabeto[(ordinale[self.stringa[i]] + ordinale[verme[i % len(verme)]]) % 26]
return cifrata
def gödel(self, primo):
|
||||
self.stringa = self.stringa.lower().replace(" ","")
cifrata = 1
sequenza = primi.lista(primo, len(self.stringa))
for i in range(len(self.stringa)):
cifrata *= sequenza[i]**(ordinale[self.stringa[i]] + 1)
return cifrata
def vernam(self):
|
||||
self.stringa = self.stringa.lower().replace(" ","")
cifrata = ""
pad = generatore.onetimepad(len(self.stringa))
for i in range(len(self.stringa)):
cifrata += alfabeto[(ordinale[self.stringa[i]] + pad[i]) % 26]
return cifrata, pad
class decodifica:
|
||||
def __init__(self, valore):
|
||||
valore = str(valore)
|
||||
if valore.isnumeric(): self.numero = int(valore)
|
||||
else: self.stringa = str(valore)
|
||||
def rot13(self):
rotazione = str.maketrans("nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
|
||||
self.stringa = self.stringa.lower().replace(" ","")
decifrata = ""
for i in range(len(self.stringa)):
decifrata += (alfabeto[(ordinale[self.stringa[i]] - ordinale[verme[i % len(verme)]]) % 26])
return decifrata
def gödel(self, primo, n):
decifrata = ""
for i in primi.lista(primo,n):
lettera = -1
while self.numero % i == 0:
self.numero /= i
lettera += 1
decifrata += alfabeto[lettera % 26]
return decifrata
def vernam(self, pad):
|
||||
self.stringa = self.stringa.lower().replace(" ","")
cifrata = ""
for i in range(len(self.stringa)):
cifrata += alfabeto[(ordinale[self.stringa[i]] - pad[i]) % 26]
return cifrata
|
1
crittografia/numeri.py
Normal file
1
crittografia/numeri.py
Normal file
@ -0,0 +1 @@
|
||||
import math,random,itertools,pyaudio
class primi:
def primo(n):
for i in range(3, int(math.sqrt(n)) + 1,2):
if n % i == 0: return False
return True
def prossimo(n):
if n % 2 == 0: n += 1
while True:
n += 2
if primi.primo(n): yield n
def lista(p, n):
return tuple([p for p in itertools.islice(primi.prossimo(p), n)])
class generatore:
def rumore(l):
audio = pyaudio.PyAudio()
output = audio.open(format = pyaudio.paInt8, channels = 1, output=True, rate = 50000)
for i in range(l*2500):
output.write(chr(int(random.random() * 25 + 1)))
output.close()
audio.terminate()
def leggirumore(l):
audio = pyaudio.PyAudio()
input = audio.open(format = pyaudio.paInt16, channels = 2, rate = 44100, input = True, frames_per_buffer = 1024)
return bytes(input.read(int(44100 / 1024 * l * 10)))
input.close()
audio.terminate()
def onetimepad(l):
dati = generatore.leggirumore(l)
numeri = [int(dati[i] * random.random() * l) for i in range(len(dati)) if dati[i] != 0]
inizio = int(random.random()*l)
return tuple([numeri[i] for i in range(inizio, inizio + l)])
|
11
crittografia/unicode.py
Normal file
11
crittografia/unicode.py
Normal file
@ -0,0 +1,11 @@
|
||||
from crittografia.numeri import *
max = 2**(32)
class codifica:
|
||||
def __init__(self, valore):
|
||||
valore = str(valore)
|
||||
if valore.isnumeric(): self.numero = int(valore)
|
||||
else: self.stringa = str(valore)
|
||||
def rot13(self):
rotazione = str.maketrans("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM")
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
cifrata = ""
for i in range(len(self.stringa)):
cifrata += chr((ord(self.stringa[i]) + ord(verme[i % len(verme)])) % max)
return cifrata
def gödel(self, primo):
cifrata = 1
sequenza = primi.lista(primo, len(self.stringa))
for i in range(len(self.stringa)):
cifrata *= sequenza[i]**(ord(self.stringa[i]) + 1)
return cifrata
def vernam(self):
cifrata = ""
pad = generatore.onetimepad(len(self.stringa))
for i in range(len(self.stringa)):
cifrata += chr((ord(self.stringa[i]) + pad[i]) % max)
return cifrata, pad
class decodifica:
|
||||
def __init__(self, valore):
|
||||
valore = str(valore)
|
||||
if valore.isnumeric(): self.numero = int(valore)
|
||||
else: self.stringa = str(valore)
|
||||
def rot13(self):
rotazione = str.maketrans("nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
return str.translate(self.stringa, rotazione)
def vigenère(self, verme):
decifrata = ""
for i in range(len(self.stringa)):
decifrata += chr((ord(self.stringa[i]) - ord(verme[i % len(verme)])) % max)
return decifrata
def gödel(self, primo, n):
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):
cifrata = ""
for i in range(len(self.stringa)):
cifrata += chr((ord(self.stringa[i]) - pad[i]) % max)
return cifrata
|
Loading…
Reference in New Issue
Block a user