-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCalcola.php
More file actions
161 lines (150 loc) · 6.58 KB
/
Copy pathCalcola.php
File metadata and controls
161 lines (150 loc) · 6.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?php
//classe base astratta per i cifrari
abstract class Cifrario
{
protected $testo;
public function __construct($testo) //costruttore per inizializzare il testo
{
$this->testo = $testo; //assegna il testo alla proprietà della classe
}
abstract public function cifra(); //metodo astratto per cifrare
abstract public function decifra(); //metodo astratto per decifrare
}
//classe per il cifrario ROT13
class CifrarioROT13 extends Cifrario //eredita la classe base
{
public function cifra()//implementa il metodo cifra
{
return $this->toROT13($this->testo);
}
public function decifra()//implementa il metodo decifra
{
//cifrare e decifrare sono la stessa operazione
return $this->toROT13($this->testo);
}
private function toROT13($testo)//funzione che applica ROT13
{
$risultato = '';
$lung = strlen($testo);
for ($i = 0; $i < $lung; $i++) { //scorre ogni carattere
$char = $testo[$i]; //prende il carattere corrente
if (ctype_alpha($char)) { //se è una lettera
$ascii = ord($char); //ottiene il codice ASCII
$base = ctype_upper($char) ? ord('A') : ord('a'); //base ASCII per maiuscole/minuscole
$risultato .= chr((($ascii - $base + 13) % 26) + $base); //applica ROT13
} else {
$risultato .= $char; //se non è una lettera, lo lascia invariato
}
}
return $risultato;
}
}
//classe per il cifrario di Vigenère
class CifrarioVigenere extends Cifrario //eredita la classe base
{
private $chiave;
public function __construct($testo, $chiave) //costruttore per inizializzare testo e chiave
{
parent::__construct($testo); //chiama il costruttore della classe base
$this->chiave = $this->pulisciChiave($chiave); //pulisce e assegna la chiave
}
public function cifra()//implementa il metodo cifra
{
return $this->toVigenere($this->testo, true); //true per cifrare
}
public function decifra()//implementa il metodo decifra
{
return $this->toVigenere($this->testo, false); //false per decifrare
}
private function pulisciChiave($chiave)//funzione per pulire la chiave
{
//rimuove tutto tranne le lettere e converte in maiuscolo
return strtoupper(preg_replace('/[^a-zA-Z]/', '', $chiave)); //[^a-zA-Z] = tutto tranne lettere
}
private function toVigenere($testo, $cifra)//funzione che applica Vigenere
{
if (empty($this->chiave)) { //se la chiave è vuota
throw new Exception("La chiave non può essere vuota"); //lancia un'eccezione
}
$risultato = '';
$lungChiave = strlen($this->chiave);
$indiceChiave = 0;
$lung = strlen($testo);
for ($i = 0; $i < $lung; $i++) { //scorre ogni carattere
$char = $testo[$i]; //prende il carattere corrente
if (ctype_alpha($char)) { //se è una lettera
$isUpper = ctype_upper($char); //controlla se è maiuscola
$base = $isUpper ? ord('A') : ord('a'); //base ASCII per maiuscole/minuscole
$valoreCarattere = ord(strtoupper($char)) - ord('A'); //posizione della lettera nell'alfabeto
//posizione della lettera chiave nell'alfabeto, $indiceChiave % $lungChiave serve per ripetere la chiave
$valoreChiave = ord($this->chiave[$indiceChiave % $lungChiave]) - ord('A');
if ($cifra) { //se sta cifrando
$nuovoValore = ($valoreCarattere + $valoreChiave) % 26; //si sommano i valori modulo 26
} else {
$nuovoValore = ($valoreCarattere - $valoreChiave + 26) % 26; //si sottrae la chiave, aggiungendo 26 per evitare valori negativi
}
$nuovoCarat = chr($nuovoValore + ord('A')); //nuovo carattere calcolato convertito in carattere
$risultato .= $isUpper ? $nuovoCarat : strtolower($nuovoCarat); //se è maiuscola lo lascia, altrimenti lo converte in minuscolo
$indiceChiave++; //avanza l'indice della chiave
} else {//se non è una lettera
$risultato .= $char; //lo lascia invariato
}
}
return $risultato;
}
}
//classe per gestire le operazioni di cifratura
class CifrarioManager
{
private $cifrario; //istanza del cifrario
public function processa($metodo, $operazione, $testo, $chiave = null) //processa la richiesta
{
try {
if (empty($testo)) { //se il testo è vuoto
throw new Exception("Il testo non può essere vuoto");
}
//creazione dell'istanza del cifrario appropriato
switch ($metodo) {
case 'rot13': //se il metodo è rot13
$this->cifrario = new CifrarioROT13($testo); //crea l'istanza di ROT13
break;
case 'vigenere': //se il metodo è vigenere
if (empty($chiave)) { //se la chiave è vuota
throw new Exception("La chiave è obbligatoria per il cifrario di Vigenere");
}
$this->cifrario = new CifrarioVigenere($testo, $chiave); //crea l'istanza di Vigenere
break;
default:
throw new Exception("Metodo di cifratura non valido");
}
//esecuzione dell'operazione
if ($operazione === 'encrypt') { //se l'operazione è cifrare
return $this->cifrario->cifra(); //chiama il metodo cifra
} elseif ($operazione === 'decrypt') { //se l'operazione è decifrare
return $this->cifrario->decifra(); //chiama il metodo decifra
} else {
throw new Exception("Operazione non valida");
}
} catch (Exception $e) {
return "Errore: " . $e->getMessage();
}
}
}
//elaborazione della richiesta POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') { //se è una richiesta POST
//prende i dati dal form
$metodo = $_POST['method'];
$operazione = $_POST['operation'];
$testo = $_POST['text'];
$chiave = $_POST['key'];
$manager = new CifrarioManager(); //crea l'istanza del manager
$risultato = $manager->processa($metodo, $operazione, $testo, $chiave); //processa la richiesta
//redirect alla pagina principale con il risultato
header('Location: index.php?result=' . urlencode($risultato));
exit;
} else {
//se non è una richiesta POST, redirect alla pagina principale
header('Location: index.php');
exit;
}
?>