it-swarm-tr.com

Şifreleme Algoritmaları Yazma Teknikleri (Sadece Kişisel Kullanım İçin)

Bu soruyu, kendi şifreleme algoritmalarınızı yazmanın tehlikelerini tam olarak anladığımı belirterek anlatmak istiyorum ve asla, kendim dışındaki herkesin verilerini korumak için ev yapımı şifreleme kullanmam.

Bugün öğrendiğimiz her şeyi tek bir programda bir araya getiren bir bilgisayar bilimi dönem projesi atandım. Bu programın işlevselliğinin bir kısmı, Dizeleri şifreleyip şifresini çözebilmesidir. Bu şifreleme yöntemlerini kendimiz yazmak zorundayız, bu nedenle kullandığımız dile (Java) yerleşik hiçbir şeyi kullanamayız. Son olarak, şifreleme için bir anahtar kullanan her şeyden kaçınmamız gerekir.

Şimdi, bazı sınıf arkadaşlarımla konuştuktan sonra, neredeyse herkes ROT13 veya benzer bir yöntem kullanıyor gibi görünüyor. Ben bir aşırılıkçıyım ve herkes gibi olmak istemediğim için kendi şifreleme yöntemimi tasarlamak istiyorum. Ancak, nereden başlayacağımı biraz kaybettim. Peki, şifreleme için hangi temel veya gelişmiş teknikler var?

18
Josh

Genel olarak projenizin ötesindeki şifreleme ile ilgileniyorsanız :

Ne tür bir şifreleme yapmak istediğinize bağlıdır. Büyük uyarı: Bu cevap sizi sadece doğru teorik yöne yönlendirmektir. Zıplamadan önce çok fazla okuma yapmanızı tavsiye ederim - ne kadar çok okursanız, önceki şifrelerin nasıl kırıldığını ve aynı hataları yapmadığını anlayacaksınız.

Ortak anahtar

Bir ortak anahtar sistemini çalıştırmak için bir Trapdoor işlevi gerekir. Ne yazık ki, wikipedia ile ilgili tavsiye oldukça doğrudur:

Birkaç işlev sınıfı önerildi ve kısa süre sonra Trapdoor işlevlerinin bulunması ilk başta düşünülenden daha zor oldu.

Trapdoor fonksiyonları oldukça zordur; Kapaklı permütasyonlar (fonksiyonların çıkış ve giriş setlerinin aynı olduğu ve fonksiyonun setin içindeki girişi "izin verdiği") daha da zordur. Kabaca söylemek gerekirse, asal çarpanlara ayırma sorunu ve ayrık logaritma sorunu iki "büyük" sorundur. Şans bu alandadır, mevcut olanı kullanmak en kolay yaklaşım olacaktır.

Simetrik Anahtar

Simetrik anahtar algoritmaları kasıtlı olarak tersine çevrilebilir, ancak girişlerden biri (anahtar) olmadan geri döndürülmesi çok zor olacak şekilde tasarlanmıştır. Temel fikir karışıklık/difüzyon ilkesi . Modern şifrelerde yaygın teknikler arasında ikame permütasyon ağları ve feistel ağları bulunur. Ayrıca şifre işlem modlarını engelle üzerine okuma yapmayı da düşünmelisiniz.

Doğru, harika, nereden başlamalıyım?

Okuyarak - olabildiğince. Standart tavsiyeden hoşlanmıyorum "kendi kriptonunuzu tasarlamayın". Bence insanlar isterlerse denemeliler. Ama doğru olmanın ne kadar zor olduğunu yeterince vurgulayamıyorum. Projeniz için sınırlı bir süreniz olduğundan, bir teknik mevcut bir şifrenin basit bir örneğini kullanmak olabilir, bu nedenle:

Projeniz için

Bir eğitim egzersizi olarak RC4 uygulaması çok kolaydır. Bir zamanlar (çok uzun zaman önce değil) bu, SSL/WEP trafiğini korumak için kullanıldı - bazen hala kullanılıyor, bu yüzden gerçek bir şifre kullanacaksınız. bazı güvenlik sorunları - bunların anlaşılması da genel kripto eğitiminiz için size yardımcı olacaktır. Ancak, gereksiniminiz daha az mutlak güvenlik ve daha fazla öğrenme olduğundan, bunun ideal olacağını düşünürdüm.

Kendinizi oldukça hırslı hissediyorsanız ve dilinizi iyi biliyorsanız, AES'nin ECB modunda uygulanması o kadar da zor değildir. FIPS-197 oldukça okunabilir ve genellikle algoritmayı oldukça erişilebilir bir şekilde açıklıyor.

ROT13'ü kötü bir örnek olarak kabul etme hakkınız var. Her karakterin ofsetini bilmemek bile, ASCII), doğru metin düşene kadar şifre metninizin 127 (veya genişletilmiş ASCII için 255) ofsetinin her birini denediğinizi varsayarsak, 13 yerdi. Bu yüzden şifresini çözmek, anahtar olmadan bile oldukça önemsizdir.

15
user2213

Anahtar kullanan herhangi bir şeyden kaçınmalısınız? Şahsen, bir anahtar kullanmıyorsa algoritmayı "şifreleme" olarak adlandırabileceğinizi göremiyorum.

Basitleştirilmiş DES'in kendi uygulamanızı yazmayı düşünebilirsiniz. Adından da anlaşılacağı gibi, Simplified DES (veya S-DES) DES'in çok basitleştirilmiş bir sürümüdür. 10 bitlik bir anahtar kullanır ve kalem ve kağıtla çalışmak için yeterince basittir.

Bu makale , "Basitleştirilmiş DES" için ilk Google hitidir. Ayrıca http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ adresinde görsel bir simülatör var.

8
Jonathan

Eğlencenizi bozmak istemiyorum, ama aşağıdakileri düşünmek istiyorsunuz:

  1. Aslında, şifreleme nedir? Şifreleyen ve şifresini çözen şeylerin özellikleri nelerdir ve bunu neden bir toplum olarak yapıyoruz? Sürecin yanı sıra özellikleri de düşünmek istiyorsunuz.
  2. Anahtar nedir? Araştırmanıza dayanarak, eğitmeninizden bu noktanın açıklanmasını talep edebilirsiniz.
  3. Tüm şifreleme teknikleri ailelerinden oluşan bir sınıflandırma sistemi oluşturun. Bu araştırmayı yaparak ilginç bir cevap bulabilirsiniz.

Bu sömestr tabanlı bir projedir, bu yüzden bir gecede cevaplayabileceğiniz (veya yapmanız gereken) bir şey değildir. Kodun kendisi yalnızca bir veya iki gün sürebilir. Gerçek öğrenme, verilen kısıtlamalara dayalı çözümler bulmaktır.

4
logicalscope

ygulamalı Şifreleme El Kitabı . Bu kitap aynı zamanda "El Kitabı" olarak da bilinir. Onun özgür ve iyi yazılmış. Ancak Bölüm 2, "Matematiksel Altyapı" oldukça sert, bu kavramların çoğu yerel devlet üniversitemde öğretilmiyor (baktım).

2
rook

Karmaşık "karışıklık" ve "yayılma" basitleştirilmiş bir sürümünü görmek istiyorsanız William Stallings mükemmel bir --- yazdı Basitleştirilmiş DES uygulama .

Grafik kağıdına çizdiğim (ve aktarımları yaptığım) yeterince kolay. Ancak sizi tüm temel işlevlere götürür DES kullanır ve şifreleme-şifre çözme işleminin tek bir turunda size yol gösterir.

2
Joseph Kern

Size getirilen kısıtlamalara bağlı olarak, şifrelemeyi makul bir şekilde kolayca kırmak için son derece zor olabilirsiniz - bu şifreleme, gerçek dünyada temelde kullanılamaz hale getiren pratik kusurlara sahiptir, ancak ROT13, Sezar kullanıcıları, vb. size tek seferlik bir ağ sağlayan bir entropi kodlama sistemi oluşturacaksınız

Disk sürücünüzdeki tüm dosyaları ham okumak için kendinize bir şeyler yazın - bu oldukça kolaydır, hiyerarşik özyinelemeli dizin taraması için google, ham/ikili tüm dosyaları açın ve içeriklerini emin

Her bayt akışında akışa başladığınızda, kendinize bir alt dosya yinelemesi aradığınız bir ana dosya yapın (bunlardan şu andan itibaren dize olarak bahsedeceğim, bu oldukları gibi, bunlar sadece metin dizeleri değildir) giriş - zaman içinde mümkün olan en uzun eşleştirme dizilerini tercih eden, ancak girdiyi yinelenen şekilde daha küçük dizelere ayırabilecek bir algoritma oluşturmanız gerekir - eğer http://en.wikipedia.org/wiki/Huffman_coding Bunu başarmak için belirli bir algoritma göreceksiniz, ancak bu kadar ileri gitmenize gerek yok - ancak uygulamalar muhtemelen hayatınızı kolaylaştıracak kod parçaları verecektir.

Şimdi, bir şeyi kodlamak için, giriş dizesini alın ve aynı işlemi uygulayın, ana dosyadaki en uzun uzunluktaki alt dizeleri bularak ve giriş dizesini ana dosyadaki eşleşen alt dizenin ofset ve uzunluğu ile değiştirin - bunun herhangi biriyle eşleşeceğini unutmayın. dize, çünkü günün sonunda tek bir bit aramak için geri çekileceksiniz. Kullanmanız gereken bir güvenlik görevlisi, aynı dizinleri yeniden kullanmaya başlamadan önce eşleşen tüm dizeler arasında dolaşmanız gerektiğidir - bir ana dosya hayal edin 1'leri ve 0'ları değiştirdiğinizde ve girişleri yalnızca bit düzeyinde eşleştirebilirsiniz (teknik olarak imkansız ancak benimle birlikte taşıyabilirsiniz) - 5 1'lik bir dize aldıysanız, bunu 1: 1,3: 1,5 olarak kodlarsınız : 1,7: 1,9: 1 (evet, bir kusur, bu kodlamanın belirli durumlarda aşırı derecede verimsiz hale gelebileceğidir) (nb - bitleri kodlarsanız, kodu zayıflatacaksınız - yalnızca ofseti hareket ettirirseniz ekstra noktalar ancak bu, bu yayının kapsamı dışında kalan çok boyutlu, çok boyutlu bir haritalama stratejisidir)

Yeniden kullanılan endekslerin sayısını takip edin - amacınız bunun asla gerçekleşmeyecek kadar büyük bir ana tabloya sahip olmaktır - eğer bu gerçekleşirse ve sadece bir mesajı kodlayacaksanız, kodun olabilmesi için evrenin ısı ölümüyle öleceğinden oldukça emindir. daha fazla mesaj kırdığınızda, ENDEKSLERİN NEREDE KULLANILDIĞI, kodunuz daha fazla zarar görüyor (dil analizi, kalıp analizi, vb.) Şimdi işte yakalama - bu kodu başka bir tarafla kullanmak için - onlara bir kopyasını almanız gerekiyor ana tablo - bunu sadece bizzat yapmalısınız, aktarım medyasını her zaman kontrolünüz altında tutmalısınız ve aktarım tamamlandığında yok etmelisiniz - ve ana tablodaki herhangi bir makine zarar görürse, kodunuz tost olur - o zamana kadar, oldukça zor

İyi eğlenceler

1
Mark Mullin

İki yönlü şifreleme için, çoğu algoritma, bir anahtarın ikili kodunu ve girişin ikili verilerini karşılaştırarak bir x veya operatörü kullanır, bu bir anahtar kullanamayacağınız için bu sizin için doğru olmayabilir ... nasıl çalışır:

Giriş verileri: 10011101101001 Anahtar: 123 = 1111011

Anahtar girişten daha küçüktür, bu yüzden tekrarlanması gerekir:

Giriş verileri: 10011101101001 Anahtar: 123 = 11110111111011

(Java veri girişinin tüm bitleri boyunca bir veya bir while döngüsü için saymak için bir değişken kullanın ...) Şimdi şifreli sonucu oluşturmak için x veya prensibi kullanın (iki yol karması) giriş verilerindeki her biti döngüden geçirin ve anahtardaki karşılık gelen bitle karşılaştırın, eğer aynıysa, sonuca 0 ekleyin, eğer değilse, sonuca 1 ekleyin ... Sonuç daha sonra olacaktır:

Giriş verileri: 10011101101001 Anahtar: 123 = 11110111111011 Sonuç = 01101010010010

Verilerin şifresini çözmek için şifrelenmiş veri oluğunu çalıştırın:

Giriş verileri: 01101010010010 Anahtar: 123 = 11110111111011 Sonuç = 10011101101001

İdeal olarak, anahtarı oluşturmak için sha, md5, ripemd vb ... gibi bir karma işlev kullanırsınız, daha sonra ikili hale getirebilirsiniz ... önceden yapılmış bir algoritmayı kullanamazsanız, anahtarı oluşturmak için kendi algoritmanızı oluşturabilirsiniz. karşılaştırılması ... sadece sonuçtaki tüm bitlerin sonucu oluşturmak için birbirine bağlı olduğundan emin olun ... örnek:

şifre: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 vb ...)

şimdi her biti (rakamı) döngüye sokun ve bunları bir sayaçla birlikte ekleyin, örnek: count = 0 sonuç = "" paroladaki her rakamı yapın {sonuç = sonuç & (basamak + sonuç [sayı-1]) * sayım) sayım = sayım +1}

sonuç = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6+ 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153

anahtar sonuç = 16152845669120153 İkili: 111001011000101110110101110100001110000011100010011001 (Bu çok kötü bir örnektir ... iyi bir algoritma ile düşünmelisiniz. fith sonucunu oluşturmak için ilk birleştirme sonucu ...)

ama sonra tekrar, eğer bir anahtar kullanamazsan, bunu kullanamazsın ...

1
Daniel V

Coursera'da Stanford Üniversitesi'nden Crypto I sınıfına göz atın. Genel anahtar şifrelemesinin yanı sıra akışı ve blok şifrelerini bozar. Sadece ilk dersleri izleseydiniz çok daha bilgili olursunuz. Ayrıca kurs, güvenlik açıklarını ve kripto uygulamalarını kırma yöntemlerini de kapsar.

0
Andrew