it-swarm-tr.com

Asimetrik şifreleme / şifre çözme rutininin basit bir örneği var mı?

Java, Perl ve JavaScript kodlarını çok iyi anlayabiliyorum. Gerisi, ben çalışmadım, ama sanırım nasıl okunacağını/tercüme edileceğini anlayabiliyordum.

Asimetrik rutinlerin en basiti nedir bilmek istiyorum. Endişelenmek gerçekten çok mu karmaşık?

Sadece şifreleme anahtarına sahip olmanın nasıl mümkün olduğunu gerçekten merak ediyorum! Tersine mühendisliğe dayanabilmesi bana inanılmaz geliyor, bu yüzden nasıl çalıştığını bilmek istiyorum!

  1. Bunun için çok mu karmaşık?.
  2. Bir uygulamaya bakabileceğim en basit standart Asimetrik şifreleme rutin (ler) i nedir?
  3. Eğer böyle bir şey olursa, güzel olacak minimum kod örnekleri var.

Nasıl Çalışır Wikipedia paragrafları zaten kontrol ettim, ama matematiksel bir döküm veya uygulama açıklaması yoktu, sadece birçok uygulama . Hangisine rastgele bakacağımı gerçekten seçmek istemedim, ne de en sağlam ve en karmaşık olduğunu beklediğim en yaygın olanı almak istemedim.

Düşüncesi olan var mı?

11
Bryan Field

Kredi, detaylar için Jeff'in cevabı ve Steve'in cevabı 'a gider. Kredi ayrıca, tüm işlevler için Wikipedia'ya bağlantılar içeren tylerl'in cevabı , özellikle modInverse 'a gider, ayrıca e. Teşekkürler, Yanıtlarınızı iptal ettim ve her üç yanıtın birleşik bilgilerini kullanarak, daha iyi bir cevap olmasını umduğumu yarattım.

Yapmanın anahtarı Tersine mühendislik çok pahalı gücü kullanıyor. Karekök o kadar zor değil, 3'ün gücü küp bir köke ihtiyacınız olduğu, ancak 34.051.489'un gücünün oldukça zor olduğu anlamına gelir. Tersine mühendislik zor olan başka matematiksel işlemler de vardır. Asimetrik bir Algoritma oluşturmanın birden fazla yolu vardır, ancak bu cevap RSA'ya odaklanır. En eski ve en yaygın olanı.

RSA Algoritması ( Java Kod )

Aşağıdaki hesaplamalar keyfi tamsayılar ile yapılmalıdır. (BigInt veya BigInteger gibi)

Anahtarları oluşturma:

  • Sabit anahtar uzunluğu l.
  • Genellikle sabit e_start, basitlik için =3 olabilir. Bununla birlikte, 0x10001 daha yaygındır, her halükarda, asal bir sayı en iyidir (anahtar oluşturma performans nedenleri ve muhtemelen diğer nedenlerle).
  • p ve q, depolama için l bit gerektiren rastgele üretilen pozitif asal sayılardır. (Bunları olumlu tutmak için ilk bit her zaman 0 olur)
  • n = p*q Bu hem şifreleme hem de şifre çözme için kullanılır.
  • ee_start olarak başlar. Bu sonunda şifreleme anahtarının bir parçası olacaktır.
  • m = (p-1)*(q-1), e değerini, şifre çözme için kullanılacak d biçimine dönüştürmek için kullanılır.
  • while(gcd(e,m)>1){e+=2} Bu, bir sonraki adımın çalışması için gereklidir.
  • d=modInverse(e,m) Bu, standart bir aritmatik işlem gerçekleştirir. Muhtemelen çok fazla incelemeye değmez, özellikle programlama dilinizde yerleşik

Şifrelemek veya şifresini çözmek için, önce baytlarınızı tek bir keyfi hassas tam sayıya dönüştürün.

Şifreleme:encrypted=(plain^e)%n

Not: plain>=n ise, plain değerini iki veya daha fazla küçük değere bölmeli ve ayrı olarak şifrelemelisiniz.

Şifre Çözme:plain=(encrypted^d)%n

Asimetrik şifreleme genellikle Simetrik şifrelemeden daha az verimlidir. Bazen Asimetrik şifreleme yalnızca anahtar değişimi için kullanılır.

6
Bryan Field

RSA'ya gelince, this takip edilebilecek iyi bir örnek sağlar ve karşılık gelen girdi ve çıktı örneklerini gösterir. Bu demo uygulama çeşitli adımlarda size yol gösterecek ve işi kontrol etmenizi sağlar. Bazen sadece böyle bir şey adım adım yolunuzu tıklamanız yardımcı olacaktır. Wikipedia makaleleri için, gerçek algoritma makalesine bakmanız gerekir: RSA karşılık gelen matematik için.

Uygulama açısından, bunu Java in satırın altında içinde açıkça bir araya getirebilirsiniz.

Anlamanız için, yalnızca şifreleme anahtarı diye bir şey yoktur. Aksine, ortaklarının operasyonlarını tersine çeviren iki eşit anahtar vardır. Çiftlerden birini özel olarak, diğerini de kamuya atarız. Bir anahtarla şifrelenen öğelerin şifresi diğer anahtarla çözülebilir. İmzalamada kullanılan prensip budur.

Anahtarları güvenli kılan bir anti-ters mühendislik meselesi değil, eşleşen anahtarı bulmak için büyük anahtar alanını (anahtar gerçekten çok sayıda alan kullandığında) makul bir şekilde kontrol edemediğiniz matematiksel bir kavramdır. Faktoring çalışması için gerçek bir hızlanma yoktur.

Öğrenilecek başka asimetrik anahtar algoritmaları da var, ama dışarıya bakarken önce en eski ve en yaygın olan RSA'yı anlamaya çalışacağım.

13
Jeff Ferland

python (daha önce hiç görmediyseniz bile python okumak çok kolay) kullanarak RSA gösterisini bir araya getirdim. ancak kısa bir süre içinde okuyabileceğiniz ve anlayabileceğiniz kadar kısa.

Şifreleme/şifre çözme tek bir yerleşik komutta gerçekleştirilebildiğinden - exp(PLAINTEXT,KEY,MODULUS) - Ayrıca tüm anahtar türetme sürecinden de geçiyorum.

Kodu burada bulabilirsiniz: https://Gist.github.com/1239116

Kodu çalıştırdığınızda, sizden >12345 veya <12345, nerede > öneki sayıya özel anahtar uygulanmasını söylerken, <, ortak anahtarın uygulanmasını söyler. Basitlik adına, sadece sayıları kodlar; ancak buna sahip olduğunuzda, rastgele verileri kodlamak sadece biçimlendirme meselesidir.

6
tylerl

Aslında, anladığım kadarıyla etrafındaki matematik oldukça basit. Çok büyük bir asal sayının (binlerce hane) gücüne değer veriyorsunuz ve başka bir sayıdan bir mod yapıyorsunuz.

Şifrelemek için şöyle bir şey var: EncryptedBits = (PlainText ^ YourPublicKey)% Modulus

Ve şifresini çözmek için şöyle bir şey var: PlainText = (EncryptedBits ^ YourPrivateKey)% Modulus

Burada okumak için oldukça kolay bir belgeye rastladım: http://mathaware.org/mam/06/Kaliski.pdf

Yine de bakacak herhangi bir kütüphaneden emin değilim.

5
Steve

Sevimli, minimal bir Perl çözümü istiyorsanız, Adam Back tarafından klasik bir çözüm var 1995 :

" Bu tişört bir Mühimmattır " . Bu ifade ABD'de güçlü şifreleme 1996'da yeniden sınıflandırıldı teknik olarak artık bir "mühimmat" olmayacak kadar doğruydu. Ancak, İhracat Yönetimi Düzenlemeleri (EAR) 2000 yılında revize edildi :

Yazılım ayrıca bir dövme, e-posta imzası, posta etiketi ve diğer birçok formda dağıtıldı ve hatta New York Times (makale olmadan fotoğraf, çevrimiçi Bir Hacker Ve Zor Bir Yer Arasında ). Daha yeni bir 2 satırlı sürüm:

print pack"C*",split/\D+/,`echo "16iII*o\[email protected]{$/=$z;[(pop,pop,unpack"H*",<>
)]}\EsMsKsN0[lN*1lK[d2%Sa2/d0<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<J]dsJxp"|dc`

Orijinal yaklaşımın keyfi hassas aritmetik için Unix "dc" programına dayandığını unutmayın. Ek açıklama içeren saf Perl sürümü

2
nealmcb