14 Eylül 2015 Pazartesi

Dbfşbs Şfabs ejzf ölüonba

Stanley Kubrick'in meşhur 2001: A Space Odyssey adlı sinema eserinde yapay zeka ürünü bir bilgisayar var ve yapay zeka unsurunun konu edildiği her filmde olduğu gibi insiyatifi eline alıp hayatı insanlara zehir ediyor, hatta bazılarının ölümüne sebebiyet veriyor. Bilgisayarın adı HAL 9000 ama filmde bilgisayara kısaca HAL diyorlar. Şimdi İngiliz alfabesinden HAL'ın ismindeki her harfi bir sonraki ile değiştirelim: H→I, A→B ve L→M oluyor. Diğer bir ifadeyle HAL, IBM'e dönüşüyor. Söylemeye lüzum yok, IBM hem o zamanların hem de günümüzün en önde gelen teknoloji üreticilerinden birisi. Kubrick bunun bir tesadüf olduğunu söylüyor. Epey manidar bir tesadüf...

HAL'ın ismindeki harfleri bir kaydırmak zorunda değiliz. Mesela dört kaydırdığımızda LEP oluyor yapay zeka mamülünün adı. LEP'ten HAL'a geri dönmek istersek, o zaman da dört geri kaydıracağız. Kubrick Amerikalı değil de Leh (Polonyalı) olsaydı ve bilgisayarına HAL yerine WYZC diye bir isim seçseydi, o zaman modüler aritmetiğe başvurmak zorunda kalacaktık. Z harfini dört kaydırmak için alfabenin başına dönüp, oradan devam edecektik ve WYZC, ACDG olacaktı.

Yukarıda tarif ettiğimiz yöntem aslında antik çağlarda haberleşme güvenliğini sağlamak için Sezar tarafından kullanılıyordu ve Sezar şifrelemesi olarak bilinir. Sezar şifrelemesinde metindeki her bir harf alfabade $n$ birim kaydırılır. $n$ burada kilitleme anahtarı olarak adlandırılır. Alıcı ise deşifreleme için şifreli metni $n$ birim geri kaydırır ya da $-n$ birim ileri. Burada $-n$ ise açma anahtarı olabilir. Görüldüğü gibi metni şifreleyen ve deşifreleyen anahtarlar farklı. Öte yandan birisini bilince ötekini de hemen buluyorsunuz. Aşağıda kendisi kripto gibi olan bir şiirin 22 harf kaydırılarak şifrelenmiş hali görülüyor.

kara bir irin akiyor
opunce o yikilmis gulusunden cocuklarin
kara bir salgidir cunku buyuk
seruvenler ve cocuklarin soluk alislari da
urker herkes usumus bir anahtar olagelmekten     
bir cocugun sehri carpar yuzumun varoslarina
gwnw xen enej wgeukn
klqjya k uegehieo cqhqoqjzaj ykyqghwnej
gwnw xen owhcezen yqjgq xquqg
oanqrajhan ra ykyqghwnej okhqg wheohwne zw
qngan dangao qoqiqo xen wjwdpwn khwcahiagpaj
xen ykyqcqj oadne ywnlwn uqvqiqj rwnkohwnejw

Sağ taraftaki mesaja bakınca sanki birisi rasgele klavyenin tuşlarına basmış gibi görünüyor. Şöyle düşünebilirsiniz: Böylesine tesadüfi görünen ve manasız bir metni deşifrelemek çok zor olmalı. Maalesef yanlışsınız. Sezar şifrelemesi sadece nostaljik ve tarihi öneme sahiptir. Çünkü alfabenizde kaç harf varsa, ancak o kadar anahtarınız olabilir. Şifreli mesajınızı ele geçiren bir saldırganın yapması gereken sadece -o da en kötü durumda- alfabenizdeki harf sayısından bir eksiği kadar deneme yanılma ile metindeki harfleri kaydırmaktır. Öte yandan Sezar döneminde insanların çoğunun okuma yazma dahi bilmediği düşünülürse, kendi çağı için güzel bir fikir olduğunu söyleyebiliriz.

Yıllar önce yazdığım Sezar kripto algoritmasına göre metni hem şifreleyen hem de deşifreleyen bir C programını aşağıya bırakıyorum. İyi eğlenceler.

/*
 * caesar.c is a small encryption program that (de)ciphers texts by using the
 * English alphabet. With the exception of lower and upper case letters,
 * everything else is left untouched although it is an easy matter to modify
 * the program so that they are encrypted/decrypted, too. The compiler command
 * is as follows: gcc -Wall -O3 caesar.c -o caesar
 *
 * MUSTAFA DEMIRPLAK
*/

#include <stdio.h>
#include <stdlib.h>

void encrypt(FILE *ip, FILE *op, int key);
/*
 * This function produces the ciphertext in op, from the plaintext ip using
 * the integer key according to Caesar's encryption scheme. Being symmetric,
 * negative of the key deciphers the text. Since English alphabet is used, key
 * must be in [-25,25].
*/

int main(int argc, char **argv)
{
   FILE *p1, *p2;
   if(argc != 4){
      printf("Usage: caesar [plaintextfile] [ciphertextfile] [integerkey]\n");
   } else if(abs(atoi(argv[3])) > 25) {
      printf("key (%d) must be an integer in [-25,25]\n", atoi(argv[3]));
      } else {
      p1 = fopen(argv[1],"r"); p2 = fopen(argv[2],"w");
      encrypt(p1, p2, atoi(argv[3]));
      fclose(p1); fclose(p2);
   }
   return(0);
}

void encrypt(FILE *ip, FILE *op, int key)
{
   char *line = NULL;
   int i;
   size_t len = 0;
   ssize_t read;

   while((read = getline(&line, &len, ip)) != -1) {
      for(i=0; i < read-1; i++){
         if(line[i] >= 'A' && line[i] <= 'Z'){
            line[i] = 'A' + (line[i] - 'A' + key)%26;
            while(line[i] < 'A')
               line[i] = line[i] + 26;
         } else if(line[i] >= 'a' && line[i] <= 'z'){
            line[i] = 'a' + (line[i] - 'a' + key)%26;
            while(line[i] < 'a')
               line[i] = line[i] + 26;
            }
      }
      fprintf(op,"%s",line);
   }
   free(line);
}

Hiç yorum yok:

Yorum Gönder