Forum: Ders Arası RSS
Şifreli Metin
Bu bir yarışma değildir...:)
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Şifreli Metin
Merhaba,

MüzikKutusu ı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...:)

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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-10-18, 12:09.
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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ı:
O♫‼♠♣♣
www.ddili.org

Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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:

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
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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ı.

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
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
işler git gide karmaşıklaşır. Burada sonraki işlemin önceki ile kesişmemesi yeterli olacaktır.

Ben şifreleme konusundan fazla anlamıyorum. O yüzden "doğrudur" demekten başka çarem yok. :D

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-10-28, 02:34.
erdem (Moderatör) #12
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kriptografi kelimesini inceleyecek olursak.

Kripto eski yunancada gizli, grafi ise yazı anlamına geliyor. Kriptoloji kelimesinde ise gizlilik bilimi anlamına geliyor.

Açık anahtarlı (asimetrik) ve gizli anahtarlı olmak üzere iki çeşit şifreleme var. Gizli anahtarlı şifrelemede tek bir anahtar kullanılıyor. Örneğin Ali ile Ayşe'nin bu anahtarı zaten bildiği kabul ediliyor. Açık anahtarlı şifrelemede ise şifreyi oluşturup, çözmek için kullanılan anahtarlar farklı olabiliyor. Örneğin Google hem açık hem de gizli anahtarlı şifrelemeyi kullanıyor. Açık anahtarlı şifreleme uzun anahtarlar, çok fazla matematik gerektirdiği için masraflı olabiliyor.

Bir de kendi şifreleme yöntemini oluşturmak çok zor. Çünkü kolaylıkla yanlış yapabileceğiniz bir şey. Örneğin programı bir kara kutu gibi düşünelim. Bir mesaj giriyoruz. Bir anahtar var. Bu anahtarla şifrelenmiş bir mesaj oluşturuyor. Ama bu şifreleme işlevinin girilen mesaja göre ne kadar sürdüğü ölçülebiliyor.Buna timing side channel deniliyor. Ayrıca bu işlevin merkezi işlem biriminin ön belleğinde 'cache' yaptığı değişiklikler de gözlenebiliyor. Böylece bir şekilde görünür oluyor. Ayrıca bu işlev işlemcinin ne kadar güç tüketiminde de değişiklik yapıyor. İşte bunlar doğru bir şifreleme yöntemi oluşturmanın karşısında oluşan zorluklar.

O yüzden kriptoloji konusundaki kurslarda ilk öğrettikleri bu. Yani bu derslerde öğretilenlerle çok hassas bilgilerin örneğin bir füzenin güvenlik kodlarının korunamayacağı  :-)

http://www.udacity.com/overview/Course/cs387/CourseRev/apr…
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 05:04:57 (UTC -08:00)