Useful shortcuts for vi editor

Wednesday 30 March 2011

Sezar şifreleme örneği

İlkel şifreleme yöntemleri arasında kendine yer bulan Sezar şifreleme bir kaydırma şifreleme yöntemidir. Yukarıdan bakıldığında işleyişi basittir; şifreyi gönderen kısım bir anahtar belirler ve bu anahtarı kullanarak mesajını şifreler, daha sonra karşı tarafa hem şifreli mesajını hem de anahtarını verir. Karşı taraf (şifreli mesajı ve anahtarı alan) anahtarı kullanarak şifreli mesajı açar.
            

Örnek olara A’dan B’ye bir şifreli mesaj gönderdiğimizi düşünelim. A’nın şifrelemek istediği mesaj “merhaba” olsun. A’nın seçtiği anahtarda 3 olsun. Yani;

Plain Text (Mesajın Aslı) = merhaba
Key (Anahtar) = 3 olur.

Bu parametrelere göre şifrelenen mesaj şu şekilde olur;
Sezar şifrelemede gönderilecek mesajdaki her bir karakter anahtar kadar ötelenir. Buradaki örneğimizdeki mesajın ilk karakteri olan ‘m’ 3 karakter ötelenerek, ‘p’ harfine denk olur. Kısacası şifreli mesajımız;

Cipher Text (Şifreli Mesaj) = phukded olur.

Bu yaptığımız işlemleri formülize edersek;

Ccipher text = Pplain text + Kkey diyebiliriz.

Daha sonra şifreyi alan kısım (B) anahtar kullanarak tersi işlem yaparak mesajın aslını elde eder.

Konunun pekişmesi amacıyla bunu bir de konsol (console) uygulamamızda bakalım.

/*Alper Özsöyler*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int boyut=5;
char *dizi;
int temp;

printf("Sezar Sifreleme - Kaydirma Sifrelemesi (Ceasar's Cipher - Shift Cipher)");
printf("\nYalnizca kucuk harfler icin tasarlanmistir!");

dizi = (char *) malloc (boyut * sizeof(char)); //Char tipinde pointer dizisi tanımlandı ve yer ayrıldı.

printf("\n\nSifrelenecek metini giriniz: (Cikis icin 0)\n-> ");

for(int i=0; i<boyut; i++)
{
char harf;
harf = getch();
printf("%c",harf);

if(harf == '0')
{
dizi[i]='C';
break;
}

dizi[i] = harf;

if( i == boyut - 1 )
{
    dizi = (char *) realloc (dizi, (boyut+5) * sizeof(char)); //Dizinin boyutu 5 artırıldı.
   
    boyut = boyut + 5;
}

}
putchar('\n');
for ( int k=0 ; k<boyut; k++)
{  
    if(dizi[k] == 'C')
    temp=k;
}   
     
dizi = (char *) realloc (dizi, temp * sizeof(char));

printf("\nPlain Text (ASIL MESAJ): ");
for(int bas=0; bas<temp; bas++)
printf("%c",dizi[bas]);

int key;
printf("\nAnahtarinizi giriniz: ");
scanf("%d",&key);
if(key >26)
key = key % 26;

printf("\nChipher Text (SIFRELI MESAJ): ");
for(int i=0 ; i<temp ; i++)
{
char gndrilen=dizi[i];;
if(dizi[i] != ' ')
{
gndrilen = (dizi[i] + key );

if( gndrilen >122) // z harfinden büyükse başa dön
gndrilen = gndrilen - 26;
}

printf("%c",gndrilen);
}
printf("\n\nThis program is written by Alper Ozsoyler.");
getch();
free(dizi);
return (0);

}

Yazdığımız kod yalnızca şifreleme kısmının (A) yaptığı işlemi yapmaktadır. Dikkat edilecek olunursa Latin alfabesinde bulunan 26 harfi aşan bir öteleme olursa, örneğin ‘z’ karakterini anahtarı 2 olan ile ötelersek bunun sonucunun ‘b’ karakteri olacak şekilde olmasını sağladık.

if( gndrilen >122) // z harfinden büyükse başa dön
gndrilen = gndrilen - 26;

Son olarak bir de şifreyi alan kısmını (B) inceleyelim.

/*Alper Özsöyler*/

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

int main()
{   char *dizi;
    int boyut = 5;
    int temp;
    dizi = (char *) malloc (boyut * sizeof(char));
    printf("Sezar Sifreleme - Kaydirma Sifrelemesi Cozumu\n(Ceasar's Cipher - Shift Cipher)");
    printf("\nYalnizca kucuk harfler icin tasarlanmistir!");
    printf("\n\nSifrelenmis mesaji giriniz (Bitis icin 0) :\n<-- ");
    for(int i=0 ; i<boyut ; i++)
    {
    char harf;
    harf = getch();
    printf("%c",harf);
   
                      if(harf == '0')
                      {
                      dizi[i]='C';
                      break;
                      }

    dizi[i] = harf;
     
            if( i == boyut - 1 )
            {
            dizi = (char *) realloc (dizi, (boyut+5) * sizeof(char)); //Dizinin boyutu 5 artırıldı.
   
            boyut = boyut + 5;
            }
   
    }
   
    for ( int k=0 ; k<boyut; k++)
    {  
    if(dizi[k] == 'C')
    temp=k;
    }   
     
      dizi = (char *) realloc (dizi, temp * sizeof(char));
   
    printf("\n\nChipher Text (SIFRELI MESAJ): ");
    for(int bas=0; bas<temp; bas++)
    printf("%c",dizi[bas]);

    int key;
    printf("\nAnahtarinizi giriniz: ");
    scanf("%d",&key);
    if(key >26)
    key = key % 26;
   
    printf("\nPlain Text (ASIL MESAJ): ");
    for(int i=0 ; i<temp ; i++)
    {
    char gndrilen=dizi[i];;
    if(dizi[i] != ' ')
    {
    gndrilen = (dizi[i] - key );

    if( gndrilen <97)
    gndrilen = gndrilen + 26;
    }

    printf("%c",gndrilen);
    }
printf("\n\nThis program is written by Alper Ozsoyler.");
getch();
free(dizi);
   
    return 0;
}

Bu yazımızda Sezar şifrelemeyi inceledik. Bunun gibi şifreleme yöntemleri, algoritmalarının çok daha fazlasını www.bilgisayarkavramlari.com da bulabilirsiniz. Herkesle şifresiz iletişim kurmanız dileğiyle, hoşçakalın J

Bilgi: Örnek için standart 26 harfli Latin alfabesi kullanılmıştır.