Ö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.
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.