1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
| #include <stdio.h> #include <conio.h> int main() { FILE *fptr; FILE *fptr2; int sec; char dosya_adi[50]; char temp, son; int ba, ia, ua; a: printf ( "1 - Sifrele\n2 - Sifre coz\n3 - Cikis\n\nSeciniz ? : " ); scanf ( "%d" , &sec); switch (sec) { case 1: { printf ( "\nLutfen sifrelenecek metnin bulundugu txt uzantili dosyayi program ile ayni\nklasore koyun. Ardindan asagiya dosya ismini, uzantisiyla beraber yazin. \nOrnegin : deneme.txt \n\nDosya adini girin : " );
scanf ( "%s" , dosya_adi); if ((fptr = fopen (dosya_adi, "r" )) == NULL) { printf ( "Dosya bulunamadi!\n\n-------------\n\n" ); goto a; } else { printf ( "Birinci anahtari girin : " ); scanf ( "%d" , &ba); printf ( "Ikinci anahtari girin : " ); scanf ( "%d" , &ia); printf ( "Ucuncu anahtari girin : " ); scanf ( "%d" , &ua); printf ( "Sifrelenmis dosyanin adini uzantisiyla birlikte girin.\nOrnegin:sifrelenmis_dosya.abc\nDosya adi:" ); scanf ( "%s" , dosya_adi); fptr2 = fopen (dosya_adi, "w" ); while (! feof (fptr)) { fscanf (fptr, "%c" , &temp); son = temp + (((ba + ia) * ua) + ba) * ba; fprintf (fptr2, "%c" , son); } fclose (fptr); fclose (fptr2); printf ( "Sifreleme tamamlandi.\n\n-------------\n\n" ); } goto a; break ; } case 2: { printf ( "\nLutfen sifresi cozulecek metnin bulundugu dosyayi program ile ayni\nklasore koyun. Ardindan asagiya dosya ismini, uzantisiyla beraber yazin. \nOrnegin : deneme.txt \n\nDosya adini girin: " ); scanf ( "%s" , dosya_adi); if ((fptr = fopen (dosya_adi, "r" )) == NULL) { printf ( "Dosya bulunamadi!\n\n-------------\n\n" ); goto a; } else { printf ( "Sifrelemede kullanilan anahtarlari sirasiyla girin.\n" ); printf ( "Birinci anahtari girin : " ); scanf ( "%d" , &ba); printf ( "Ikinci anahtari girin : " ); scanf ( "%d" , &ia); printf ( "Ucuncu anahtari girin : " ); scanf ( "%d" , &ua); printf ( "Cozulmus dosyanin adini uzantisiyla birlikte girin.\nOrnegin : cozulmus_dosya.txt\nDosya adi : " ); scanf ( "%s" , dosya_adi); fptr2 = fopen (dosya_adi, "w" ); while (! feof (fptr)) { fscanf (fptr, "%c" , &son); temp = son - (((ba + ia) * ua) + ba) * ba; fprintf (fptr2, "%c" , temp); } fclose (fptr); fclose (fptr2); printf ( "Sifre cozme tamamlandi.\n\n-------------\n\n" ); } goto a; break ; } case 3: { return 0; break ; } default : { printf ( "\nYanlis giris yaptiniz.\n\n-------------\n\n" ); goto a; } } getch(); return 0; } Kütüphanelerimizi ekledik. Değişkenleri tanımladık. İki tane file pointer tipinde değişken. Şifrelenecek dosyanın okunup, yeni dosyanın yazılması eşzamanlı gerçekleştiği için iki tane tanımladık. Biri okuduğumuz dosyayı, diğeri ise yazdığımız dosyayı tutuyor. “sec” değişkeni integer tipinde. Menüden hangi seçeneğin seçildiğini tutacak. “dosya_adi” isminde bir karakter dizisi, bundan da okunacak ve yazılacak dosyaların isimlerini programa bildirirken yararlanacağız. “temp” ve “son” değişkenleri karakterleri ve ascii kodları değiştirildikten sonraki yeni hallerini tutacak.”ba”, “ia” ve “ua” ise anahtarlarımızı tutan değişkenler.
“a:” yazdığımda, o satırı belirliyorum, daha sonra “goto a” komutuyla o satıra gideceğim. Bu, şifreleme işlemleri tamamlandığında tekrar başa dönmeme yarayacak.
Basit bir menü yazdırdım. Üç seçeneği var; şifrele, şifre çöz ve çıkış. Seçeneklerin ne yapacağı oldukça açık. Kullanıcının seçimi, “sec” değişkenine atanıyor. Aşağıda da “sec” değişkenini switche sokuyorum. Şurada switch – case yapısından ve menü oluştururken kullanılabileceğinden bahsetmiştim.
Kullanıcı seçim ekranında 1 girdiyse, şifreleme yapacağız demektir. “case 1″in içini inceleyelim:
Kullanıcıya ne yapması gerektiğini bildirdik. Dosya programla aynı dizine konacak. Dosyanın adını scanf ile aldık. if’e baktığımızda, FILE tipinde tanımladığımız “fptr” değişkeni ile, ismi kullanıcıdan aldığımız “dosya_adi” değişkeni olan bir dosyayı “r”, yani read (okuma) formatında açmaya çalışıyoruz. Eğer bu işlem bize NULL döndürürse if’in içine gireriz ki o da dosyanın bulunamadığını bildirip üstte tanımladığımız a satırına gider.
Eğer dosya açma girişimimiz başarılıysa else’e girer. Else’in içinde yapılanlara bakalım. Kullanıcıdan sırasıyla birinci, ikinci, üçüncü anahtarlar ve şifrelenmiş yeni dosyanın adı alınıp ilgili değişkenlere atanıyor. Üstte tanımladığımız ikinci FILE tipindeki değişken olan fptr2 yardımıyla, dosya adı kullanıcıdan son aldığımız “dosya_adi” değişkeni olan dosya “w”, yani write (yazma) modunda açılmaya çalışılıyor.
“w” modunda dosya açarken eğer dosya varsa, içindeki her şey temizlenir, dosyaya yazmaya öyle başlanır. Eğer o isimde bir dosya yoksa, dosya yaratılır, yazmaya öyle başlanır. Bu durumda “w” modunda iken açma girişimi başarısız olamayacağı için “fptr2″nin durumunu if ile kontrol etmeme gerek yok.
while(!feof(fptr)) şu anlama gelir: “fptr” ile açtığımız dosyada, yani içinde orijinal metnin bulunduğu dosyada “feof”, yani dosyanın sonunda (end of file) “!” değilken dönen bir while döngüsü. Yani orijinal metnin bulunduğu dosyanın sonuna gelene kadar döngü devam edecek.
While’ın içinde ne yapıyoruz:
“fscanf” ile “fptr” değişkeni yardımıyla açtığımız dosyada “%c” sıradaki karakteri okuyup “temp” değişkenine atıyoruz.
Ardından bu karakterin ascii koduna, anahtarlarla yaptığımız “(((ba + ia) * ua) + ba) * ba” işleminin sonucunu ekleyerek “son değişkenine atıyoruz.
“fprintf” ile de “fptr2″ ile açtığımız dosyanın, yani şifrelenmiş metnin bulunacağı dosyanın içine “%c” bir karakter yazıyoruz ki, bu karakter de “son” değişkeni.
Sonuç olarak orijinal metnin ilk karakterini değiştirip şifrelenmiş olan metnin ilk karakteri olarak yazıyoruz. Bu döngü orijinal metni içeren dosyanın sonuna gelene kadar dönecek, her karakter değiştirilerek yeni dosyaya işlenecek.
Ardından “fclose” ile açtığım iki dosyayı da kapatıyorum. Bu büyük dosyalarla çalışırken bellekten kazanmaya yarayabilir. İşimiz bittiğinde dosyaları kapatmak her zaman iyidir. Kullanıcıya şifrelemenin tamamlandığını söyleyerek “a” satırına, yani menüye dönüyorum.
Şifreleme kısmı bu kadar. Şifre çözmede de olay birebir aynı. Tek farkı; ascii kodunu değiştirirken kullandığımız fonksiyonu tersten işleterek, değiştirilmiş karakterleri orijinal hallerine döndürüyoruz.
Yani “(((ba + ia) * ua) + ba) * ba” işleminin sonucunu ekleyerek değiştirmiştik karakterleri, bu sefer aynı işlemin sonucunu çıkartarak gerçek karakterin ascii koduna, dolayısıyla karaktere ulaşmış oluruz. Bu yüzden şifrelerken ve çözülürken kullanılan anahtarların birebir aynı girilmesi önemli.
Çıkışı nasıl yaptığımıza bakarsak, onda da “case 3″ün içine “return 0;” yazdım. Bu da main fonksiyonunu sonlandırdı ve programdan çıktı.
default case’de ise kullanıcıya yanlış giriş yaptığını söyleyip a satırına, yani menüye geri döndük.
Orijinal metin : berk baykal
2-2-2 anahtarlarıyla şifrelenmiş metin : vy†4vuu€€ (Bazı karakterler burada hatalı çıktı, not defteriyle açınca bir sorun yok.)
Şifresi çözülmüş metin : berk baykalll
Burada son karakteri üç defa yazmasının sebebi bir şifrelerken, bir de çözerken dönen while döngülerinin 1 kez fazla dönmeleri diye düşünüyorum. Açıkçası nasıl çözülebileceği hakkında pek kafa yormadım. Zaten önemli olan, olayın mantığını aktarabilmek. Yazı da, kod da uzun oldu. Umarım canınızı sıkmamışımdır. Birilerine faydalı olabildiysem ne mutlu bana… |
0 yorum: