BASİT ŞİFRELEME TEKNİKLERİ

    Burada antıcağım olayları daha once yazdığım programlardaki isim, açıklama vs bilgileri değiştiren kaşarlı lamerları atlatmak için kullanmıştım.Böyle bir sorunu olan arkadaşlar burada anlattıklarımı kullanarak bu dertten kurtulabilirler.

    Burada basit ama oldukça etkili 3 şifreleme olayından bahsedicem.Dediğim gibi olaylar oldukça basit.Ama bunları geliştirerek (mesela birbiri üzerine farklı şifreleme yöntemleri kullanılarak) karmaşık şifreleme rutinleri yazılabilir. 1. XOR OLAYI     Oldukça sık kullanılan basit bir şifreleme olayıdır.Buradaki olay aslında tamamen bir baytı başka bir bayt ile XOR işlemine tabi tutmaktan ibaret.Şifrelenmiş yazıyı çözmek de çok basit; işlemi tekrarlamak yeterli (Tabi doğru anahtar biliniyorsa :-) Eğer anahtar bilinmiyorsa, şifreyi kırmak çok zordur.Örnek bir Pascal kodunu da aşağıya koydum. Const
    TrScene:String='Turkish Scene is cool !';
Var
    i:Byte;
Begin
    Write(TrScene, ' yazısının şifrelenmiş şekli:');
    For i:=1 To Length(TrScene) do TrSc
ene[i]:=Chr(Ord(TrScene[i]) Xor $55);
    WriteLn(TrScene);
   Write('Şifre çözüldükten sonra: ');
    For i:=1 To Length(TrScene) do TrScene[i]:=Chr(Ord(TrScene[i]) Xor $55);
    WriteLn(TrScene);
End.

XOR olayı tabiki bu kadar değil.Bir kodun/stringin vs tek bir bayt ile XORlanması ile yeterli oranda bir şifreleme elde edilemez.Bu yüzden, bir anahtar sözcük ile XOR'lama yapmak çok daha iyidir.Mesela; 'SIFRELEME RUTINI' ni 'password' sözcüğünü kullanarak XORla şifrelersek;

Kaynak

Anahtar Sonuç
S
I
F
R
E
L
E
M
E

T
E
K
N
I
K
L
E
R
I
p
a
s
s
w
o
r
d
p
a
s
s
w
o
r
d
p
a
s
s
#
(
5
!
2
#
7
)
5
A
'
6
<
!
;
/
<
$
!
:
    sonucunu elde etmiş oluruz.Sonuçta elde ettiğimiz karakterleri şifreleme sözcüğü ile bir kez daha xorlayarak şifreyi kaldırabiliriz.Bu işi halleden kodu da aşağıya ekledim. Const
    ST:String='SIFRELEME TEKNIKLERI';
    AN:String='password';
Var
    i,j:Byte;
Begin
    WriteLn('Orjinal String : ',ST);
    j:=1;
    For i:=1 to Length(ST) do
    Begin
        ST[i]:=Chr(Ord(ST[i]) Xor Ord(AN[j]));
        Inc(j);
  
      If j>Length(AN) Then j:=1;
    End;
    WriteLn('XOR Sonrası : ',ST);
End.
2. SAYI EKLEME/ÇIKARMA     Bu olayın aslı şifrelenecek olan yazının/kodun vs. her baytına belli bir baytın eklenmesi veya çıkarılması sonucu yazının değiştirilmesidir.Aşağıda bu yönteme örnek olarak bir pascal kodu koydum. Const
    TrScene:String='Turkish Scene is cool !';
Var
    i:Byte;
Begin
    Write(TrScene, ' yazısının şifrelenmiş şekli:');
   
For i:=1 To Length(TrScene) do TrScene[i]:=Chr(Ord(TrScene[i]) + $55);
    WriteLn(TrScene);
   Write('Şifre çözüldükten sonra: ');
    For i:=1 To Length(TrScene) do TrScene[i]:=Chr(Ord(TrScene[i]) - $55);
    WriteLn(TrScene);
End.
    Bu olayda da XOR gibi bir kelime ile işleme sokarak şifrelemek mümkün. Ben bu olayı kullanıcağım zaman ilk once bir sayı eklemeyi ardındaki bayttan sayı çıkarmayı tercih ederim. 3. BIT KAYDIRMA     Bit kaydırma olayında da mantık çok basit.Bir baytı binary sayı sisteminde düşünürsek bir baytın en soldaki bitini tutup en sağa yerleştirirsek bayt değişecektir.Mesela; 10011011 sayısının en soldaki bitini en sağa kaydırırsak sayı 00110111 sayısını elde ederiz. Buna göre; 10011011 -> 1.kez -> 00110111
00110111 -> 2.kez -> 01101110
01101110 -> 3.kez -> 11011100
11011100 -> 4.kez -> 10111001
10111001 -> 5.kez -> 01110011
01110011 -> 6.kez -> 11100110
11100110 -> 7.kez -> 11001101
11001101 -> 8.kez -> 10011011
sonuçlarını elde elmiş oluruz.Gördüğünüz gibi (yaptığımız işlemin bir sonucu olarak) 8.ci kez bit kaydırma sonunda eski sayımızı elde etmiş oluyoruz.     Şimdi bu işlemin nasıl yapılacağını anlatayım.Assembly ile oldukça kolay. İşleme koyacağımız baytı 1-4 arası istediğimiz kez ROR veya ROL işlemine tabi tuttuğuzda bu iş bitmiş olur.Şifreyi çözmek için; Eğer ROR işlemi yaptıysak 8-işlem sayısı kadar daha ROR işlemi yapmalı veya ROR yaptığımız kadar ROL işlemi yapmamız gerekli.Örnek assembly kodu aşağıda.Bunu derlerseniz 77 bayt uzunluğunda bir COM dosya elde edeceksiniz. .Model Tiny
.Code
.286
;ROR.ASM
;Derlemek için
;TASM ROR.ASM
;TLINK /T ROR.OBJ   
Org 100h
Main Proc Near
    Lea Dx,Basla
    Push Dx
EkranaYaz:
    Lea Si,Yazi
    Mov Cx,(Offset Sifre_Sonu-Offset Yazi)
Char_Al:
    Mov Dl,Byte Ptr [Si]
    Mov Ah,2
    Int 21h
    Inc Si
    Loop Char_Al
Yazma_Bitti:
    Mov Ah,09
    Lea Dx,SatirBasi
    Int 21h
    Ret
Basla:
    Lea Si,Yazi
    Mov Cx,(Offset Sifre_Sonu-Offset Yazi)
RORla:
    Ror Byte Ptr [Si],3    ;=Rol Byte Ptr [Si],5
    Inc Si
    Loop RORla
    Jmp Sifre_Sonu
SatirBasi Db 10,13,"$"
Yazi Db 'ABCDEFGHIJKLMNOQRSTUVWXYZ'
Sifre_Sonu:
    Call EkranaYaz
    Mov Ah,4ch
    Int 21h
Main Endp
End Main
    Bu anlattığım 3 olayı değişik şekillerde birleştirerek oldukça farklı şeyler yapılabilir.Mesela programın ilk başında sadece bit kaydırma, ileriki bazı bölümünde xor olayı daha sonra sayı çıkarma vs gibi rutinler bile bazen programı debug eden kişi için bunaltıcı olabilir. Bir text kütüğü XOR ile şifreleyen bir program kodu aşağıda.Bu programın derlenmiş şeklini download etmek için
buraya tıklayın. Program Sifre;
Var
    f :File;
    Pass :String;
    FileName :String;
    i :Byte;
    Bayt :Byte;
Begin
    WriteLn('TEXT Dosyası şifreleyici/çözücü');
    WriteLn('Coded by DarkApocalypse/TurkishScene, 1999');
    WriteLn;
    Write('İşlem yapılacak dosya: ');ReadLn(Filename);
    Assign(f,Filename);
    {$I-} Reset(f,1); {$I+}
    If IOResult<>0 Then
    Begin
        WriteLn('Dosyayı açarken hata oluştu.');
        Halt
;
    End;
    Write('Şifre: ');ReadLn(Pass);
    i:=1;
    Repeat
        BlockRead(f,Bayt,1);
        Bayt:=Bayt Xor Ord(Pass[i]);
        Seek(f,FilePos(f)-1);
        BlockWrite(f,Bayt,1);
        Inc(i);
        If i>Length(Pass) Then i:=1;
    Until
FilePos(f)=FileSize(f);
    Close(f);
    WriteLn('Tamamdır');
End.

Şimdi de bu gördüklerimizi programımız içinde nasıl kullanacağımıza bakalım.
Const Mesaj:String='3.)&;*1!;a<?6!r#9;?:w"771+';
Function SifreCoz(Msg,Sifre:String):String;
Var i,j:Byte;
Begin
    j:=1;
    For i:=1 to Length(Msg) do
    Begin
        Msg[i]:=Chr(Ord(Msg[i]) XOR Ord(Sifre[j]));
        Inc(j);
        If j>Length(Sifre) Then j:=1;
    End;
    SifreCoz:=Msg;
End;
Begin
    WriteLn(SifreCoz(Mesaj,'PASSWORD'));
    WriteLn;
End.
    Buraya kadar hep bayt bazında şifreleme yaptık.Burada sürekli bayt şifrelemek yerine word, doubleword (long/longint vs) kullarak da şifreleme işlemi yapabiliriz.
   

ANA SAYFA:::::