ricordo che
A XOR B = (A OR B) AND NOT ( A AND B)
oppure
A XOR B = ( A AND NOT B) OR ( B AND NOT A)
quindi
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 1 = 0
l'operatore XOR è l'inverso di se stesso: applicarlo in un senso o in un senso inverso non fa differenza
In Excel possiamo implementare una applicazione crittografica simmetrica con XOR per trasformare un testo in chiaro in bit in un testo cifrato e per ricondurre il testo cifrato in un testo in chiaro conoscendo la chiave crittografica:
testo | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
chiave | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
testo cifrato | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
testo cifrato | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
chiave | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
testo | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
Però è anche possibile usarla non per cifrare un intero testo (troppo lungo) ma per inviare al destinatario una nuova chiave crittografia da applicare ad un file con un algoritmo tipo AES . Naturalmente mittente e destinatario devono aver già concordato in presenza la prima chiave per poter generare tutte le altre una per ogni nuovo messaggio.
Ecco una possibile implementazione in C/C++
#include#include using namespace std; int main(int argc, char *argv[]) { int testo[100]; int password[100]; int critto[100]; int i; int car; cout << " quanti caratteri? "; cin >> car; for( i= 0; i <= car-1; i++) { cout<< "inserisci carattere " << i+1 << " del testo chiro o cifrato " << " "; cin >> testo[i]; } for(i= 0; i <= car-1; i++) { cout<< "inserisci carattere " << i+1 << " della password " << " "; cin >> password[i]; } for(i= 0; i <= car-1; i++) { critto[i] = testo[i] ^ password[i]; } cout << "testo codificato o decodificato "; for(i= 0; i <= car-1; i++) { cout << critto[i]; } cout << "\n"; system("PAUSE"); return 0; }