XOR adalah operasi logika per-bit (bitwise) yang membandingkan dua buah bit yang apabila salah satunya bernilai benar, maka hasil akhir operasi XOR ini adalah benar. Namun apabila kedua bit yang dibandingkan bernilai salah atau keduanya bernilai benar, maka hasil akhirnya adalah salah.
Untuk lebih jelasnya perhatikan tabel kebenaran berikut:
X Y X^Y
--------------
1 1 0
1 0 1
0 1 1
0 0 0
Keunikan dari perintah ini adalah, apabila kita melakukan operasi XOR dua kali terhadap suati bit (dengan operand yang sama), maka hasil akhirnya akan kembali ke bit semula.
X Y X^Y (X^Y)^Y
------------------------
1 1 0 1
1 0 1 1
0 1 1 0
0 0 0 0
Terlihat, pada contoh di atas, ketika bit X di XOR-kan dengan Y, kemudian hasilnya di XOR-kan lagi dengan Y maka akan menghasilkan bit X. Nah sifat inilah yang dapat digunakan untuk melakukan enkripsi sederhana.
Misal terdapat karakter
A = 01000001 di XOR kan dengan 10000000 maka hasilnya akan menjadi 11000001 atau karakter
┴ dan jika di XOR kan lagi, maka akan kembali menjadi 01000001 atau
A lagi.
Perhatikan kode berikut.
// ED-Xor - Melakukan enkripsi-dekripsi dengan menggunakan
// operasi bitwise dengan operator XOR (^)
#include <iostream>
using namespace std;
void EncDecXOR(char*, int);
const int key = 199; // Key untuk enkripsi
int main()
{
char buffer[1024]; // Penampung input. maximum 1024 karakter
cout << "Masukan string yang akan di Enkripsi: ";
// Masukan input string dari standar output ke buffer[]
cin.getline(buffer, 1024-1);
EncDecXOR(buffer, key); // Enkripsi string di buffer[]
cout << "Hasil Enkripsi : " << buffer << endl;
EncDecXOR(buffer, key); // Dekripsi string di buffer[]
cout << "Hasil Deksripsi : " << buffer << endl;
system("PAUSE");
return 0;
}
// EncDecXOR() - Melakukan enkripsi-dekripsi dengan menggunakan XOR
// berdasarkan key yang ditentukan oleh user
void EncDecXOR(char* szString, int nKey)
{
for(int i=0; szString[i]; i++)
{
szString[i] = szString[i] ^ nKey;
}
}
Perhatian langsung kita fokuskan saja pada fungsi EncDecXOR(). Pada fungsi tersebut, terdapat looping yang akan menjelajahi setiap karakter dari string yang ditunjuk oleh pointer szString. Nah pada setiap karakter, akan dilakukan operasi XOR dengan nilai nKey dan kemudian hasilnya akan dimasukan lagi ke variabel yang ditunjuk oleh pointer szString.
Jadi pada contoh diatas, nilai dari buffer, setelah fungsi ini dipanggil, akan berubah menjadi string dalam bentuk terenkripsi. Ketika fungsi EncDecXOR() dipanggil lagi dengan parameter yang sama, baru nilai buffer akan kembali seperti semula.
Jika kode di atas dieksekusi, maka tampilannya adalah sebagai berikut: