0%

Kriptoloji (Şifreleme Bilimi)

  1. Kriptografi : Şifreleyerek bilgilerimizi gizlemektir.
  2. Kriptoanaliz : Başkaların şifreli metinlerini inceleyerek, metni elde etmektir
Encode : Farklı formata dönüştürme. Utf8 -> Base64,Hex

Plaintext P: Metin

Ciphertext C: Şifrelenmiş Metin

Key K: Şifreleyen anahtar. Şifre

Cipher : Şifreyici

Encrypt : Metni şifreleme fiili

Decrypt : Şifrelenmiş metni çözme fiili ( - deşifre )

Base64 : Verilerin 2^6 lik, 64 karakterle ifadesini sağlar. Bu biçimi binaryler ve ASCIIler çevrilebilmektedir. Genelde sonlarında = veya == bulunur. Herkes tarafından bilinir ve encoding/decoding yapılabilir.

Kerckhoff Prensibi

Bir kripto sisteminin güvenliği algoritmayı gizli tutmaya bağlı olmamalıdır. Sadece Key'in gizliliğini bağlı olmalı. Çünkü algoritmayı değiştirmek zordur.

XOR

Farklı olma durumu arayan kapıdır. 00=0 , 01=1 , 10=1 , 11=0
A xor B = A
A xor A = 0
A xor B xor A = B
Son kısma dikkat ; P xor K xor K = P oluyor. Yani XOR ile şifrelemede Key iki defa kullanılamaz.
P1 xor K = C1
P2 xor K = C2
olsun. O zaman
C1 xor C2 = P1 xor P2
Yani Şifrelenmiş iki metni'nin xor, Şifrelenmemiş hallerinin iç içe geçmiş hali olacaktır. Eğer bunu bir resimde yapsaydık, iki resmi içi içe görürdük.

OTP (Vernam)

One-time pad (Tek kullanımlık Şerit): P xor K = C 'nin tektek her bit için kullanıldığı. P ve K şeritlerini alıp C şeridi veren şifreleme türüdür. Sadece bir defa kullanılmalıdır. Kırılmasının imkansız olduğu kanıtlanmıştır. Anahtar üretme ve dağıtma zorluğu vardır.

Rastgelelilik

Rastgelelilik bir teoridir. Birşeyin rastgele olmasının sebebi, onu hesaplayamamız veya nasıl hesaplanacağını bilmemizdir.

Pseudo Random Number Generator :

Bu algoritma mod fonksiyonun geri döndürülemezlik özelliğini kullanır.

Xi+1 = (a.Xi+c)modM;

Bu C’dilin random sayı üretme algoritmasıdır. a ve c sabit değerdir. (asal sayı olması önerilir) Xi önceki random üretilen sayıdır. M ise aralık boyutudur.

Sezar Şifreleme

@monoalphabetic chiper family
P : abcd
C : bcda
K : 1
Karakterleri alfabede K sonraki harfe kaydırarak şifrelemedir.
Cn = (Pn+K)mod(HarfSayısı)
  • Harfleri frekansı(sıklığı) ölçülerek kolayca çözülebilir. Ö : Türkçede en fazla A harfi kullanılır. İngilizcede ise E harfi kullanılır. Bu bilgi dilin son yayılanan makalelerindeki harfler sayılarak elde edilebilir. Metin ne kadar uzunsa , bu yöntemle çözülmesi o kadar kolaydır.
  • Kaba Kuvvet ile Harf Sayısı kadar şifre olasılığı (ö : 29) deneyerekte çözülebilir.

Simetrik Şifreleme

Tek bir anahtar ile , hem şifreleme hemde deşifreleme işlemi yapmaktır.

DES (Veri şifreleme standartı)

Herkesin bilebildiği, şifrenin gizliliğine dayalı , IBM tarafından üretilenen bir standart simetrik algoritmadır. Key 56 bit sabittir.
  • Permutasyon fonksiyonu ile yer değiştirme yapılır. Bu yüzden metinden bir bit bile değişirse, şifreli metnin neredeyse tamamı değişir.
  • Metin ikiye bölünür.(sol,sağ) Keyden subkeyler üretilir. Sağ taraf, subkey ile F fonksiyonuna yönlendirilir. F fonksiyonu, sol taraf ile xor'lanır. Sonraki aşamada XOR'lanmış değer sağ taraf, F fonksiyonun sol taraf olur. Bu işlem 16 defa yapılır.
  • Rivayet: Artık kullanımı iptal edilmiştir. Güvensizdir. Çünkü : Deşifrelemede, key'e bir bit yaklaşılırsa. Metinin yarısı çözülür.
  • 99da 22 saat 15 dakikada kırılabilmiştir. (Metin : Romada görüşürüz. Herkes AES kullansın.)
  • DES'in açığı bilerek bırakılmamıştır. O dönemde güçlü olduğu düşünülüyordu. (1977)

AES (Gelişmiş şifreleme standartı)

Joan Daemen ve Vincent Rijmen adlı 2 belçikalı bulmuştur. Romadaki AES yarışmasında birinci olmuştur. (15 algoritmadan) Asıl adı : RIJNDAE
  • AES, 2000 yılında çıktı. Keyler 128,196 ve 256 bittir. Blok boyutu 128 bittir.

RC4

40-2048 bit key sahibi, 256 roundlik bir şifreleme biçimidir.

Asimetrik Şifreleme

Şifrelemek için ayrı şifre, şifrelemiş metini çözmek için ayrı şifre gerek şifreleme biçimidir.

RSA

Asal sayıların kullanıldığı asimetrik şifreleme algoritmasıdır.

CBC modu

iv (initialization vector) : başlangıç vektörü. şifreleme algoritması için gerekli olan başlangıç bilgisidir.(gizlenmelidir) 0. bloktan sonrakiler için gerekmemekte.

CFB modu

Kendini feedbackleyen moddur.

Hash

Veriyi özetlemek, doğruluğunu kontrol etmek için kullanılan fonksiyondur. Geri döndürülemez olmamalıdır. Adli işlerde , kanıtların doğruluğunu ve değiştirilmedini kanıtlamak için kullanılır. Hep sabit uzunlukla çıktı verir.

md5

popüler ve hızlı hash algoritmasıdır. Sözlük saldırısı ile geri döndürebilme ihtimalı vardır. md5("dsadas".text) ile tuzlama yapılarak bundan korunulabilmektedir.

Bir çok programlama dilinde var olan, String Replace fonksiyonları, bir kelimenin kullanmasını engellemede çözüm yolu olduğu düşünülse bile bu fonksiyonun bir zayıflığı vardır.

 

herhangi bir dilde stringi replace etmeyi deneyelim. (ö: php)

$id = str_replace('union', '', strtolower($_GET['id']));

Bu fonksiyon dışardan aldığı bütün union kelimeleri yok edecektir.

"union-union"  : "-"

fakat biz yinede union kelimesi gönderebiliriz.

ununionion şeklindeki bir kullanımda fonksiyon, unionu yok edip yerine yine union bırakacaktır.

"ununionion" : "union"

 

Bu zayıflığı kapatmak için algoritma

while(kelime.deVarMı(silinecek)){
kelime = kelime.replace(silinecek,"");
}

SQL injection açığı bulunan bir sitede , union komutu kullanılarak, diğer tablolardanda bilgi alma biçimidir.

sunucu tarafından şöyle bir açık olduğu varsayılsın

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

bu durumda

' OR true #

ile sql injection olduğundan emin olunur.

' UNION SELECT * FROM diger_tablo #

ile diğer tablolara erişibilir.

Fakat şöyle bir sorun çıkabilir : Tabloların kolon sayıların eşit olmaması.

' OR true UNION SELECT 1,2,3 #

Biçiminde tek tek deneyerek, mevcut tablonun kolon sayısını elde edebilirsiniz.

Not

Eğer tablo isimlerini ve kolonlarını öğrenmek isterseniz. Aşağıdaki sorgularla aynı yöntemi deneyebilirsiniz
select * from information_schema.`TABLES`
select TABLE_NAME from information_schema.`TABLES` 
select TABLE_NAME,COLUMN_NAME from information_schema.`COLUMNS`

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
<?php

//fonksiyonumuzu deneyelim : mesala 20'nin asal çarpanları
var_dump(asalcarpanbul(20));


// Bu fonksiyon sana bir sayının asal çarpanlarını array halinde döndürür
function asalcarpanbul($x){
## asalcarpanbul() : asal carpan bulma fonksiyonu by faruk can /farukcan.net
$x_guncel = $x;
$asalsayilar = Array();
$carpanlar = Array();
for($i=2;$i<=$x;$i++){
$bolenadet = 0;
for($m=1;$m<=$i;$m++){
if($i%$m==0) $bolenadet++;
}
if($bolenadet == 2){
array_push($asalsayilar, $i);
}
}
foreach ($asalsayilar as $asal) {
while($x_guncel%$asal==0){
array_push($carpanlar, $asal);
$x_guncel= $x_guncel/ $asal;
}
}

return $carpanlar;
} // fonksiyon sonu

?>

term-bruteforce

Brute force , hack saldırılarında kullanınılan, şifreyi bütün olasıkları deneyerek kırmaya yarayan bir algoritmadı.
Algoritmanın kapa-taslak işleyişi aşagıdadır

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
#include <GUIConstantsEx.au3>

Local $haneler = StringSplit("0 1 2 3 4 5 6 7 8 9 q w e r t y u ı o p ğ ü i ş l k j h g f d s a z x c v b n m ö ç Q W E R T Y U I O P Ğ Ü İ Ş L K J H G F D S A Z X C V B N M Ö Ç",' ') ;
Local $hanesay=0;
Local $sira=1;
Local $maxhane=5
Local $bitis=1

Local $gonderi= ''
Local $logsira; o anki sayinin hac haneli olacagidir
Local $kalan=0
Local $bolum;
For $i = 1 to $haneler[0] ; kaç karakterimiz oldugu ogren
$hanesay=$hanesay+1
Next
For $m = 1 to $maxhane ;
$bitis=$bitis*$hanesay
Next
MsgBox(0,0,$hanesay & "hane var. 5 sn sonra saldiracagim $sira yi değiştirmeyi unutmayın. Olası Deneme : " & $bitis)
Sleep(5000)

;bur da hane sayısına bölerek işlem yaptıracağız.
while $sira < $bitis
$logsira = Floor(Log($sira) / Log($hanesay)) + 1
$bolum=$sira
$gonderi=''
; kac haneli oldugu bulduk simdi hanesayisina bolarak onu olusturalim
if ($sira>$hanesay) Then
for $m = 1 to ($logsira-1)
$kalan=Mod($bolum,Floor($bolum/$hanesay)*$hanesay)
$bolum=Floor($bolum/$hanesay)
$gonderi= $haneler[($kalan+1)] & $gonderi
Next
$gonderi= $haneler[$bolum] & $gonderi ; en büyük basamağı sona kalır
Else ;1 haneliyse
$gonderi= $haneler[$bolum] & $gonderi
EndIf
dene($gonderi,$sira)
$sira=$sira+1
wend ; while sonu







Func dene($tus,$sira)
Send($tus)
Send("{ENTER}")

; ClipPut("SON DENEME SIRASI : " & $sira)

EndFunc
;~ Local $iMod1 = Mod(4, 2) ; 4%7 = 4 because the divisor > dividend6
;~ Local $iLog2 = Log(1000) / Log(74)