25.12.2024

Beyin Jimnastiği

Şu haberi izlerken kendime bir görev edindim. Bir beyin jimnastiği de ben yapmak istedim. Caesar şifreleme yöntemine göre alfabemizdeki her harfin "5 kez ileri" kaydırılması ile elde edilen aşağıdaki kriptolanmış cümlenin şifresini çözmeye çalışacağım.

CEZES NĞNS LIÜ ES LIÜ CIÜHI

Bu kriptolu cümle nasıl elde ediliyor; kriptolanmamış cümledeki her harf (boşluk ve noktalama karakterleri hariç; sadece harfler) için alfabedeki konumuna göre bir endeks çıkarılıyor. Alfabemizdeki harfler ve her harfin konumu aşağıdaki gibi (alttaki sayılarl sadece birler basamağı):

ABCÇDEFGĞHIİJKLMNOÖĞRSŞTUÜVYZ
0    5    1    5    2    5  8

Örnek olarak 0'dan başlayan endeksli dizimizde S harfini kriptolamak için altındaki 21 endeksine 5 daha ilave edip 26. konuma karşılık gelen U harfini yazacağız. Şifrelerken endeks bilgisinin 28'i geçmesi durumunda modül işlemini yapacağız. Yani Y harfini kriptolamak için 27'ye 5 ekleyince sonuç 32 olacak. Alfabemizde 32 harf olmadığı için

32 mod 29 = 3

bize sıfır endeksli harf dizimizdeki 3. (endekslemeyi 1'den başlatırsak 4.) harf olan Ç'yi verecek. Powershell'de mod operatörü '%' işareti.

32 % 29 = 3

Şifre çözerken de endeks bilgisinden 5 çıkaracağız. Bu durumda sayının sıfırdan küçük bir sayıya düşerse de üstüne 28 ilave edeceğiz.

Normal şartlar altında powershell ile çalışırken karakter setimizi ISO-8859-9'a çevirme gibi bir yöntem bilmiyorum. Bunun için yukarıdaki gibi Türkçe alfabeyi bir değişkene atıyorum.

$abece="ABCÇDEFGĞHIİJKLMNOÖĞRSŞTUÜVYZ"

Daha sonra verilen bir harfin alfabenin kaçıncı endeksine karşılık geldiğini ve bir endekse hangi harfin karşılık geldiğini dönecek iki fonksiyona ihtiyacım olacağını düşünerek aşağıdaki 2 fonksiyonu oluşturuyorum. Birincisi bu dizide verilen bir harfin kaçıncı endekse karşılık geldiğini söyleyecek bir fonksiyon.


function konum {
    param([char]$harf)
    for($i=0;$i -lt 29;$i++) {
        if ($harf -eq $abece[$i]) {
             $i
        }
    }
}

İkincisi ise verilen bir endekteki harfi dönecek bir fonksiyon:

function donustur {
    param([int]$konum)
    if ($konum -lt 0) {
        $konum=29+$konum
    }
    elseif ($konum -gt 28) {
        $konum = $konum % 29
    }
    $abece[$konum]
}

Bu aşamada

    konum 'E'

gibi bir işlem bana 5 dönecek. Benzer şekilde

    donustur 5

gibi bir işlem 'E' harfini dönecek. Endeksin sıfırdan küçük veya 28'den büyük olması durumlarını bu fonksiyon içinde kontrol ediyorum.

Bu iki fonksiyonumuz hazırken, hedef şifrelenmiş cümlemizi de $hedef gibi bir değişkene attığımızı düşünerek aşağıdaki gibi bir hesaplamayla şifresi çözülmüş metni bulmayı deneyelim.

$sifresiz=""
for ($it=0;$it -lt ($trg.Length);$it++) {
    $chr = [char]$trg[$it]
    $z_konum = konum $chr
    $z_donus = $z_konum-5
    $z_chrdonus = donustur $z_donus
   
    if ($chr -eq 32) {
        $sifresiz += " "
    }
    else {
        $sifresiz += $z_chrdonus
    }
}

Bu işlemin sonucunda $sifresiz değişkenimizin içeriği

VATAN İÇİN HER AN HER VERDE

olarak çıktı.

Hiç yorum yok: