Pascal - Basit Şifreleme Teknikleri

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 TrScene[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!;aFunction 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.

 

0 yorum: