Yazan: Şadi Evren ŞEKER
Şifrelenmiş bir metine saldırı yöntemlerinden birisi de frekans analizi yapmaktır. Bu yöntemde, metinde bulunan harf sıklıklarına göre bir frekans tablosu oluşuturulur. Bu tablo orjinal mesajın gönderildiği frekans sıklıkları ile karşılaştırılır ve karakteristik bazı harfler tahmin edilebilir.
Örneğin ingilizce’de e harfi diğer harflere nazaran daha sık kullanılmaktadır. Bu durumda şifrelenmiş metinde en çok geçen harf muhtemelen e harfidir denilebilir.
Aşağıdaki resimde inigilizce dilindeki harflerin frekansları verilmiştir.
Kodlama
Gelen talep üzerine frekans analizi yapan kodu da yazıya ekliyorum.
#include
#include
main() {
int karakterler[256] = {0}, toplam = 0, say = 0, c = 0;
FILE *FP;
FP = fopen("a.txt","r");
while ((c = fgetc(FP)) != EOF) {
karakterler[c]++;
say++;
}
printf("karakter [ASCII kodu]: (yüzde) sayısı\n");
for (c = 0; c < 255; c++) {
if (karakterler[c] > 0 ){
printf("%c [%d]: (%0.3f) %d\n", c, c, (karakterler[c]*100)/(float)say, karakterler[c]);
toplam += karakterler[c];
}
}
printf("Toplam karakter sayisi: %d/%d\n", toplam, say);
}
Aynı kaynak kodu girdi olarak verdiğimizde (yani a.txt dosyasının içeriğine kaynak kodu kaydediyorum) çalışma aşağıdaki şekilde çıktı vermektedir:
Sadis-MacBook-Pro:~ sadievrenseker$ vi dene.c
Sadis-MacBook-Pro:~ sadievrenseker$ g++ dene.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
Sadis-MacBook-Pro:~ sadievrenseker$ ./a.out
karakter [ASCII kodu]: (yüzde) sayısı
[10]: (4.423) 23
[32]: (16.731) 87
! [33]: (0.192) 1
" [34]: (1.923) 10
# [35]: (0.385) 2
% [37]: (1.154) 6
( [40]: (2.692) 14
) [41]: (2.692) 14
* [42]: (0.385) 2
+ [43]: (1.346) 7
, [44]: (1.923) 10
. [46]: (0.769) 4
/ [47]: (0.385) 2
0 [48]: (1.731) 9
1 [49]: (0.192) 1
2 [50]: (0.385) 2
3 [51]: (0.192) 1
5 [53]: (0.577) 3
6 [54]: (0.192) 1
: [58]: (0.577) 3
; [59]: (2.115) 11
< [60]: (0.577) 3
= [61]: (1.731) 9
> [62]: (0.577) 3
A [65]: (0.192) 1
C [67]: (0.192) 1
E [69]: (0.385) 2
F [70]: (0.962) 5
I [73]: (0.577) 3
L [76]: (0.192) 1
O [79]: (0.192) 1
P [80]: (0.577) 3
S [83]: (0.192) 1
T [84]: (0.192) 1
[ [91]: (1.538) 8
\ [92]: (0.577) 3
] [93]: (1.538) 8
a [97]: (5.577) 29
b [98]: (0.192) 1
c [99]: (3.077) 16
d [100]: (1.923) 10
e [101]: (3.846) 20
f [102]: (1.731) 9
g [103]: (0.192) 1
h [104]: (0.577) 3
i [105]: (2.500) 13
k [107]: (3.269) 17
l [108]: (2.885) 15
m [109]: (0.962) 5
n [110]: (2.115) 11
o [111]: (1.731) 9
p [112]: (1.538) 8
r [114]: (5.192) 27
s [115]: (1.923) 10
t [116]: (4.038) 21
u [117]: (0.577) 3
w [119]: (0.192) 1
x [120]: (0.192) 1
y [121]: (1.346) 7
z [122]: (0.192) 1
{ [123]: (0.962) 5
} [125]: (0.962) 5
? [177]: (0.385) 2
? [188]: (0.192) 1
? [195]: (0.192) 1
? [196]: (0.385) 2
Toplam karakter sayisi: 520/520
Sadis-MacBook-Pro:~ sadievrenseker$
Bu harika bilgiler için teşekkür ederim. Ayrıca ilgili arkadaşlar php de kelime bazlı frekans analizi denemek istiyorlarsa linki ziyaret edebilirler.; https://github.com/benbalter/Frequency-Analysis/blob/master/frequency-analysis.php
Hocam merhabalar, yazılarınızı ve kodlarınızı incelerken rastladım bu koda. Kodda integer tipinde c diye bir değişken yazmışsınız. Bunun nedeni nedir? “c” değişkeni kodda tam olarak ne iş yapıyor?