1 Aralık 2015 Salı

#C İLE KODLARI GİZLEME VEYA ORTAYA CIKARMAK

YAYINLAMA  15:05  |  in  KODLAR


Öncelikle uygulamanın ne iş yaptığından biraz bahsedeyim. Bir dosyada şifrelenecek metnimiz var. Programa bu dosyanın adını giriyoruz, ardından bizden üç tane anahtar istiyor. Sırayla anahtarları girdiğimizde dosyadaki metin, anahtarlara bağlı belli bir algoritmaya göre şifreleniyor. Bu programda şifrelemenin nasıl gerçekleştiğini açıklayacak olursak, her karakterin bir ascii kodu vardır. Bu kod bir integerdır. Biz de dosyada bulunan her bir karakterin ascii kodunu, girdiğimiz anahtarlarlara bağlı olarak bir formülle değiştiriyoruz. Sonuç olarak elimizde her karakterin ascii kodu, dolayısıyla kendisi değişmiş olan yeni bir dosya oluyor. Bu şifrelenmiş dosyanın adını da programa biz giriyoruz. Şifre çözme işlemi de benzer şekilde yapılıyor. Şifrelenmiş metnin bulunduğu dosya, şifrelemede kullanılan anahtarlar ve çözülecek metnin bulunacağı dosyanın adını girdiğimizde çözülmüş metnin dosyası oluşturuluyor. Programın kodunu aşağıya ekliyorum, sonrasında da kodu biraz inceleyeceğiz.
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†4vuu€€ (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…

PAYLAŞA BİLİRSİNİZ...

0 yorum:

Hakkımızda birşey yok-Başa Dön
Copyright © 2015 TechnoZeka. Technozeka Template by Technozeka
Proudly Powered by technozeka.
back to Top