Jump to page: 1 2
Thread overview
Şifreli Metin
Oct 18, 2012
Salih Dinçer
Oct 18, 2012
Salih Dinçer
Oct 18, 2012
Salih Dinçer
Oct 27, 2012
Salih Dinçer
Oct 27, 2012
Salih Dinçer
Oct 27, 2012
Salih Dinçer
Oct 27, 2012
Salih Dinçer
Oct 31, 2012
erdem
October 18, 2012

Merhaba,

MüzikKutusu (http://ddili.org/forum/thread/1004,3) ısınma örneğinde aşağıdaki gibi bir aşamaya gelmiştik. Aslında bu benim içimde, uhde gibi bir anlam taşıyordu. Yani görmek istiyordum farklılıkları, çözüme gitme yolunda sergilediğimiz usu (aklı). Belki insan zekasına hayran olduğum içindir...:)

Alıntı (acehreli):

>

Alıntı ():

>

Hatta bir gün sizlerle herhangi bir yarış/rekabet niyeti taşımayan bir şekilde problem çözmek isterdim.

Lütfen bugünden başla. :) Kesinlikle hatalı olanlar dışındakileri en azından bir süre kendime saklayacağım.

Başlıyoruz...

Amacımız şifreli bir metin oluşturmak. Bunu dosyaya kaydetip birine göndermek. Sonra ona anahtarı söylediğimizde aynı yazılım ile okumasını sağlamak. Elbette PGP'den tutun da basit bir şekilde ikiz asal sayıları kullanarak nice şeyler yapılabilir. O yüzden aşağıdaki gibi bir örnek ile yöntemi kısıtlamalıyım. Sadece XOR'u kullanarak metni şifreleyeceğiz. Bu sanırım en en klasik yöntemdir.

Çocukken Pascal'da resimleri bununla şifreliyordum ve tek bir döngü ile ekrana karman çurman şeyleri gelmesi çok hoşuma gidiyordu! Sonra aynı işlemden geçirdiğimde her şey düzeliyordu...:)

 import std.stdio;

 string şifresizMetin = "www.ddili.org";

 uint code(uint data, uint key) {
   return data ^ key;
 }

void main() {
 dchar[] şifreliMetin;
 foreach(uint c; şifresizMetin) {
   şifreliMetin ~= code(c, 0x89ABCDEF);
 }

 foreach(i, c; şifreliMetin) {
   şifreliMetin[i] = code(c, 0x89ABCDEF);
 }
 şifreliMetin.writeln;
}

Evet arkadaşlar, yukarıdaki gibi şeyi 100 satırı geçmemek kaydıyla nasıl yapardınız? Ben başlıyorum ve codepad.org adresine yükleyeceğim. Böylece aynı anda paylaşıp birbirimizden kopya çekmediğimiz anlaşılacak. Herkes tarih/saati belli olan bir yere yükleyip 24 saat sonra burada paylaşalım. Evet, süremiz 24 saat ama yarış değil ve buna herkes katılabilir. Hatta çok kişi katılacaksa süreyi 1 hafta yapalım. Ne dersiniz?

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2012

Azıcık geliştirdim ama bu sadece yapılabilirliğini gösteren bir örnek. Yoksa uzun bir metin incelendiğinde (hele ki Türkçe bir metin olduğu biliniyorsa) anahtar ve algoritma çok kolay bulunabilirdi. Öyle bir şey yapmalıyız ki işleri iyice karıştıralım ve kırılması için çok vakit harcansın...:)

 import std.stdio;

 string şifresizMetin = "www.ddili.org";

 dchar code(dchar data, dchar key) {
   return data ^ key;
 }

void main() {
 dchar[] şifreliMetin;
 dchar anahtar = 'a';

 foreach(c; şifresizMetin) {
   şifreliMetin ~= code(c, anahtar);
 }
 şifreliMetin.writeln;

 foreach(i, c; şifreliMetin) {
   şifreliMetin[i] = code(c, anahtar);
 }
 şifreliMetin.writeln;
}

Çıktısı:
Alıntı:

>

'O♫‼♠♣♣
www.ddili.org'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2012

Evet, amaç şifreleme algoritması geliştirmek ve bunu olabildiğince basitten ele almak:

  • 32 bitlik veriyi al
  • Bitlerini XOR'la

Bunu tek bir değişken üzerinde yaparsanız basit bir döngü ile tüm metne uygulayabilirsiniz. Eğer çok vakit alacağını düşünüyorsanız dosya okuma/yazma ve girilen metni code/decode yapma olaylarını geçelim. Prensipte bir algoritma geliştirelim. Çünkü önemli olan bunu kaç değişik şekilde yapabileceğimizdir...

İpucu: Bitler üzerinde işlem yaparken, algoritmadaki tüm basamakları tersine işlettiğinizde decode oluyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2012

Salih, bunu biraz daha açar mısın. Amaç bir şifreleme algoritması geliştirmek mi yoksa bilinen algoritmalar kullanılabilir mi?

Ben şu günlerde buna zaman ayıramam. :(

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 27, 2012

Evettt, süre bitti sanırım bir haftayı geçti bile...:)

Gerçi ben kodumu yazmıştım. Hatta öyle güveniyorum ki kendisine; herhangi bir cracker, hacker gelse de çözemez! Yiyorsa altakini çözsün bakalım... :cool:

Alıntı:

>

64D64F83-D1630AA2-B457DE42-D0B73FE2-40676EF3-F5670A53-04C65E82-D4834B47-51924804

Hatta anahtarını da vereyim D harfi...:)

Aslında bu konuda yapılabilecek o kadar basit şeyler var ki, karmaşık şeylere bence hiç ihtiyaç yok. Örneğin union ile şu çok basit bir şifreleme yöntemi:

 union şifrele { double ş; long i; }
 union çöz { long i; double ş; }
 double şifre = 123.456789;
 long kodlanmış;
 with(şifrele(şifre)) {
   writefln("%f != %d", ş, i);
   kodlanmış = i;
 }
 with(çöz(kodlanmış)) assert(şifre == ş);

Çıktısı:
'123.456789 != 4638387916139006731
'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 27, 2012

Teşekkürler Ali hocam,

Bu bana güzel bir fikir verdi. Gerçi ben de 50 satırcık bir yapı kurmuştum. Her şey bunun için de belki ne kadar basit olduğunu anlayabilirsiniz. Topu topu iki işlevi var ve nesne kurulurken de iki bilgi alıyor. Biri şifrelenecek metin (string), diğer anahtar (char).

Temelde çok basit ve kırılması kolay gibi görünüyor. Ama istesem bunu bir döngüye sokup iyice karıştırabilirim de. Nasıl çözülebilir ki...:)

Bu şuna benziyor: ZIP'lediğiniz bir dosyayı tekrar ZIP'liyorsunuz ve tekrar ve tekar! Sonuçta basitlikten (XOR) büyük bir karmaşa elde edersiniz. Döngü sayısını ve anahtarı bilmezseniz herhalde çözmek çok uzun vaktinizi alacaktır. Bir de işin içine asal sayıları falan eklesek...:)

Neyse, aralıklar ile çalışabilen bir şifreleme yapısı daha hoş gözüküyor. Sonuçta kodlayan bir işlevim var ve geriye kalıyor temel yapıya bunu yedirmek. Sanırım çok zor değil.

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 27, 2012

Kısmen hak veriyorum, şöyle ki:

XOR'lamada, ilk iletide bahsettiğim gibi ikincisi decode edilmiş veriye erişmemizi sağlıyor. Bu durumda milyarlarca milyar kere yapmanın hiç bir esprisi yok çünkü karşımızda anlaşılmaz bir şey varsa bir kere daha XOR yapmakla çözülmüş oluyor.

Ancak XOR'u tüm bit'lere sırasıyla uygulamak yerine bir algoritma çerçevesinde yaparsak sanırım işler git gide karmaşıklaşır. Burada sonraki işlemin önceki ile kesişmemesi yeterli olacaktır.

Bir de şifrelenen veriyi yukarıdaki gibi HEX'e çevirdikten sonra tekrar şifreleme enstürmanı var ki bunu hiç denemedim. Tabi denemesem de rahatlıkla verinin her seferinde artacağını ön görebiliriz. Çünkü tek ASCII karakter ile ifade edilen veriyi 2 x 16 bit ile ifade etmeye başlıyoruz. Dolayısıyla her işlemde ikiye katlanacağı için, bu tercih edilen bir yöntem olmasa gerek.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 27, 2012

Alıntı (Salih Dinçer):

>

herhangi bir cracker, hacker gelse de çözemez!

Haklısın. Verdiğin program ve kodla bile çözülemedi. :) Daha doğrusu, okunabilir bir mesaj çıkmadı.

Alıntı:

>

karmaşık şeylere bence hiç ihtiyaç yok

Ama sağlamlık da çok önemli tabii. Bu işin bilimi yapılıyor. Basit olabilse tercih edilir zaten.

Düşünmüş olduğun gibi, ben de bir aralık yazmıştım. Başka aralık algoritmalarıyla uygun olarak işlediğini göstermek için şifrelendikten sonra 'O'ya karşılık gelenleri süzen bir satır da ekledim:

import std.stdio;
import std.range;
import std.traits;
import std.conv;
import std.algorithm;

struct Şifrele(R, KodT)
{
   R aralık;
   KodT kod;

   auto kodla(ElementType!R eleman) const
   {
       return to!(ElementType!R)(eleman ^ kod);
   }

   bool empty() @property
   {
       return aralık.empty;
   }

   auto front() @property
   {
       return kodla(aralık.front);
   }

   void popFront()
   {
       aralık.popFront();
   }
}

auto şifrele(R, KodT)(R r, KodT kod)
   if (is (InputRange!R) &&
       __traits(compiles, to!(ElementType!R)(R.init.front ^ KodT.init)))
{
   return Şifrele!(R, KodT)(r, kod);
}

void main()
{
   writeln("www.ddili.org".şifrele('a').şifrele('a'));
   writeln("www.ddili.org".şifrele('a').filter!(a => a != 'O').şifrele('a'));
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 27, 2012

Alıntı (Salih Dinçer):

>

Bu şuna benziyor: ZIP'lediğiniz bir dosyayı tekrar ZIP'liyorsunuz ve tekrar ve tekar! Sonuçta basitlikten (XOR) büyük bir karmaşa elde edersiniz. Döngü sayısını ve anahtarı bilmezseniz herhalde çözmek çok uzun vaktinizi alacaktır. Bir de işin içine asal sayıları falan eklesek...:)

Düşününce öyle gibi geliyor, değil mi. Ama şifreleme algoritmalarının çeşitleri var. Bu işin bilimi var. Bunları araştırmanı öneririm.

Örneğin, bir kere XOR'lamak az karıştırıyorsa bir çok kere XOR'lamak çok karıştırmıyor. Sağlamlık açısından tek XOR ile bir trilyon gazilyon milyon kere XOR'lamak aynı şey. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 28, 2012

Ben çok anlıyormuşum gibi burada 'hacker'lık, 'cracker'lık parçalıyorum...:)

Hadi gelin cracker'lık yapalım!

Belki bu sayede bir şeyler öğreniriz. İsterseniz bunun adına tersine mühendislik (reverse engine) deyiverin. Ne derseniz deyin bir şeyi öğrenmenin en iyi yollarından biri. Elbette birileri size şifreleme konusunda çok şey söyleyebilir; Sezar Şifreleme gibi...

İşte şurada basit bir makale de var: http://kriptoloji.net/basit-sifreleme-teknikleri

Neyse, benim amacım kodlar ile yukarıda şifreyi kırmak. Tabi ben biliyorum nasıl kırılacağını ama bilmiyormuşum gibi çabalayacağım. İnşaallah önemli bir ipucu ağzımdan kaçırmam. Hoş 'key'i verdim, tekniği (XOR) de verdim. Alın size veri yapısını işleme modülü:

   import std.format;
   import std.stdio;

   union codes {
       uint i;
       char[4] b;
   }

void main() {
   char key = 'D';
   string s = "64D64F83-D1630AA2-B457DE42-D0B73FE2-40676EF3-F5670A53-04C65E82-D4834B47-51924804";
   uint[] t;

   formattedRead(s, "%(%x-%)", &t);

   auto c = new codes[t.length];
   foreach(i, x; t) {
       c[i].i = x;
       foreach(k; c[i].b) {
           k ^= key;
           k.write();
       }
   }
   writeln();
}

Elbette bu kodu çözmüyor...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2