Bu Blogda Ara

13 Ocak 2011 Perşembe

Şifrelemenin Kanunları - Bölüm 1

Şifrecilerin Gözdeleri

1.1 Özel Veya (XOR)

Özel veya olarak bilinen bu fonksiyon aynı zamanda xor olarak ya da bir daire içerisindeki artı işareti (+) olarak da gösterilebilir. a (+) b demek a ya da b fakat ikisi birden değil demektir. Matematikte normal veya (or) demek biri ya da diğeri veyahut ikisi birden demektir. Özel veya işlevi (function) C/C++/Java dillerinde mevcut olup şapka karakteri ^ ile ifade edilmektedir. (Dikkatli olun: şapka karakteri sık sık üstel ifadeler için kullanılır, fakat Java, C ve C++ dillerinde herhangi bir üstel operatör yoktur.) Java'da ayrıca özel veya mantıksal değişkenlerde de (boolean) kullanılabilmektedir.

KANUN XOR-1: Şifrecilerin gözde işlevi özel veyadır.

Özel veya şifrelemede devamlı olarak kullanılır. Bu işlev tek-seferlik şifrelemede, akış şifrelemesinde ve Gelişmiş Şifreleme Ölçünü (AES) ve bir çok yerde kullanılmaktadır.

Hatırlayalım, mantıksal sabit doğru (true) genellikle 1 olarak yanlış (false) ise 0 olarak yazılır. Özel veya toplama işlemi sonucunda mod 2 işlemini yapmakla aynıdır, yani sıradan bir toplama işlemini yaptıktan sonra sonucu 2 sayısına bölüp kalanı alma işlemidir. 0 ve 1 bit değerleri için aşağıdaki tabloda özel veya işlemi sonuçları verilmiştir.



Özel veya işlevinin bir çok ilginç özelliği vardır, a,b ve c bit değerlerini ya da dizilerini tutsun:



Yeni başlayan programcılar iki değişkenin değerini değiş tokuş yapmak için üçüncü bir geçici değişkene atama yaparak öğrenirler:

temp = a;
a = b;
b = temp;

Aynı sonucu xor işlevini kullanarak ek olarak üçüncü bir geçici alan ayırmadan gerçekleştirilebilir. a ve b değerlerinin bit dizileri olsun.

a = a xor b;
b = a xor b;
a = a xor b;


Çevirmenin yorumu:




Özel veya işlevinin şifrelemede kullanımına örnek verecek olursak, xor işlevi sözde rastgele bit akışı olan ri ile şifrelenecek mesajımızın bitlerini içeren mi akışını alsın ve şifrelenmiş halinin ci akışı olarak çıkartsın ci = ri (+) mi. Şifrelenmiş veriyi çözümlemek için aynı sözde rastsal bit akışını (yani ri) ci'ye vererek mi akışını elde ederiz. ri (+) ci = ri (+) ri (+) mi = 0 (+) mi = mi, Şekil 1.1 (Figure 1.1) bu işlem gösterilmiştir.

KANUN XOR-2: Şifreciler özel veya işlevini çok sever çünkü ivedi bir şifreleme mekanizması sağlar.


1.2 Logaritma

Tanım olarak, y = logb(x) demek b^y = x (b üssü y eşittir x). Bir başka değişle: "y, b tabanında x'in logaritmasıdır" ya da "y, x'in taban b'deki logaritmasıdır" denir. Aynı zamanda logb(x) (yani y) ifadesinin b üssü şeklinde yazılarak x değeri elde edilebilir, b^(logb(x)) = x. Daha matematiksel bir ifadeyle logaritma, üssel işlevin (exponential) tersi bir işlevdir.

KANUN LOG-1: Şifrecilerin gözde logaritma işlevi 2 tabanında logaritmadır.

Şifrelemede logaritma 2 tabanındanın kullanılmasının bir sebebi de (çoğunlukla bilgisayar biliminde) bu alanda ikili (binary) sayı düzenine yoğunlaşılmış olmasıdır.
Öyle ise y = log2(x) demek 2^y=x demekle aynı ve logaritma 2 tabanında x'in 2 üssü şeklinde yazımından x'i elde ederiz. Şekillerle ifade edersek: eğer y = log2(x) ise o zaman x = 2^y = 2^(log2(x)). Öyle ise 2^10 = 1024 demek log2(1024)=10 demekle aynı. Fark ettiyseniz tüm y değerleri için 2^y>0 ve tersten gidersek log2(x) x<=0 olduğunda tanımsızdır.

Logaritmayı içeren bir kaç formül:

log2(ab) = log2(a) + log2(b), her a,b > 0
log2(a/b) = log2(a) - log2(b), her a,b > 0
log2(1/a) = log2(a^(-1)) = - log2(a), her a > 0
log2(a^r) = r log2(a), her a > 0, r
log2(a+b) = (Ups! Bunun için basit bir formül yok.)
Tablo 1.2 log2 için bir kaç örnek vermektedir.

Bazı hesap makineleri, Java gibi diller de dahil, doğrudan log2 işlevini desteklemiyorlar. Java 10 tabanından logaritmayı da desteklemiyor yalnızca e tabanında logaritmayı destekliyor ki buna "doğal" logaritma diyoruz. Logaritma 2 tabanında a ile logaritma e tabanında a çarpımının sonucu bir sabit olduğu için eğer "sihirli" sabiti biliyorsanuz bu sonucu hesaplamak çok kolay olacaktır. Formül şöyle:

log2(x) = loge(x) / loge(2) (matematik)
= Math.log(x)/Math.log(2.0); (Java)

Sihirli sabit: loge(2) = 0.69314 71805 59945 30941 72321, yada 1/loge(2) = 1.44269 50408 88963 40735 99246. (Benzer şekilde, log2(x) = log10(x)/log10(2) ve log10(2) = 0.30102999566398114.)



Yukarıdaki formülün ispatı şöyle:

2^y = x, ya da y = log2(x) -> her iki tarafında e tabanında logaritmasını alalım
loge(2^y) = loge(x)
y loge(2) = loge(x)
y = loge(x) / loge(2)
log2(x) = loge(x) / loge(2)

KANUN LOG-2: Bir tam sayının 2 tabanında logaritmasını almak, bize o sayıyı ikili düzende (binary) kaç tane bit ile ifade edebileceğimizi söyler.

Buna göre log2(10000) = 13.28771238, yani iki düzende bu sayıyı ifade etmek için 14 tane bit gereklidir. (Gerçektende, 10000(10) = 10011100010000(2).) İkinin tam katlarının özel bir durumu vardır: log2(1024) = 10 fakat bu sayıyı ikili düzende ifade etmek için 11 adet bit gerekmektedir. 10000000000(2).

Benzer şekilde, log10(x) bize onluk sistemde bu sayıyı ifade etmek için kaç tane raka kullanmamız gerektiğini söyleyecektir.

Hiç yorum yok: