XOR Operatörü
Türkçede “özel veya” olarak bildiğimiz ve “exclusive or” kelimelerinin kısaltması olarak kullanılan XOR operatörü, mantıksal veya bit düzeyinde işlemlerde kullanılır. Bu operatör, iki değerin aynı olup olmadığını kontrol eder. Eğer iki değer aynıysa, sonuç 0’dır (yani False
); eğer farklıysa sonuç 1’dir (yani True
).
İki ifadeyi veya değişkeni karşılaştırmak için kullanıldığında, XOR aşağıdaki tabloya göre matematiksel bir işlem yapar:
$$
\begin{array}{cc|c}
\text{A} & \text{B} & \text{A XOR B} \\
\hline
0 & 0 & 0 \\
0 & 1 & 1 \\
1 & 0 & 1 \\
1 & 1 & 0 \\
\end{array}
$$
Yukarıdaki tablo, bit düzeyinde işlemlerde de aynıdır. Örneğin, ikili sayılar 1010 ve 1100 bit düzeyinde XOR işlemine tabi tutulursa, yalnızca farklı bit pozisyonları 1 sonucunu üretir:
\[
\begin{array}{c}
1010 \\
\oplus 1100 \\
\hline
0110 \\
\end{array}
\]
Yukarıda, ilk ve ikinci bitler farklı olduğu için sonuçta 1 değerini alırken, üçüncü ve dördüncü bitler aynı olduğu için sonuçta 0 değerini almıştır.
Programlama dillerinde genellikle ^
sembolü ile gösterilir. Örneğin, C, C++, Java ve Python gibi dillerde XOR işlemi şu şekilde yapılabilir:
1 2 3 |
int a = 5; // ikili olarak 0101 int b = 9; // ikili olarak 1001 int c = a ^ b; // c'nin değeri 0101 ^ 1001 = 1100, yani ondalık olarak 12 |
XOR operatörü, şifreleme işlemlerinde yaygın olarak kullanılır çünkü bir değeri, belirli bir anahtarla şifrelediğinizde, aynı anahtarla tekrar XOR işlemine tabi tutarak orijinal değeri geri alabilirsiniz. Özellikle “One-Time Pad” adı verilen bir şifreleme yönteminde çok önemlidir.
Bir casusun, merkez üsse ile güvenli bir şekilde mesajlaşması gerektiğini düşünelim. İletişim hattı güvende olmadığından, mesajın ele geçirilmesi durumunda bile düşmanın bu mesajı okuyamamasını istiyoruz. Bu nedenle, mesajın şifrelenmesi gerekmektedir.
Casus, “HELLO” mesajını göndermek istiyor diyelim. Ancak bu mesajı doğrudan göndermek yerine gizli olması adına şifrelemeye karar veriyor. Mesajın her bir harfinin ASCII değerine bakalım:
1 2 |
H E L L O 72 69 76 76 79 |
Casus, rastgele oluşturulmuş bir anahtar kullanarak bu mesajı şifreleyip anahtarın her karakteri, mesajın her bir karakteri ile XOR işlemine tabi tutulacaktır. Örneğin, rastgele anahtar “XMCKL” şeklinde olsun. Bu durumda ASCII mesaji aşağıdaki gibi olur:
1 2 |
X M C K L 88 77 67 75 76 |
Şimdi, mesajın her karakterini bu anahtarın karşılık gelen karakteri ile XOR işlemine tabi tutalım:
1 2 3 4 |
Mesaj: 72 69 76 76 79 Anahtar: 88 77 67 75 76 ------------------------- Şifreli: 24 14 15 3 3 |
Casus, bu şifrelenmiş mesajı merkez üsse gönderir. Eğer düşman bu mesajı ele geçirirse, içeriğini anlamak için anahtarı bilmek zorundadır. Anahtar rastgele oluşturulduğundan ve sadece bir kez kullanıldığından (bu nedenle “One-Time Pad” denir), düşmanın bu mesajı deşifre etmesi teorik olarak imkansızdır.
Merkez üssünde, aynı anahtar kullanılarak mesaj deşifre edilir. Anahtarın aynı karakterleri ile şifrelenmiş mesajın karakterlerini XOR işlemine tabi tutarak orijinal mesajı elde ederiz.