RSA

2012-11-21 31 views
12

'u kullanarak büyük dizeyi şifreleyin ve şifreyi çözün PKI'yı uygulamaya çalışıyorum. Ben boğa kalesi kullanmadan java'da RSA kullanarak büyük dize şifrelemek istiyorum. Sorun şu ki, veri 117 bayttan daha uzun olmamalıdır. Başarısız olduğum çözüm için ağartma denedim. Bu şifrelemede yeniyim. Lütfen örnek olarak geniş bir dize vererek bana yardımcı olun ve açıklayın.RSA

+2

Güvenlik ve özellikle kriptografi, ** sert **. Ham kripto API'leri yerine mevcut üst düzey paketleri kullanmalı veya nasıl çalıştıklarını öğrenmelisiniz. Aksi halde, güvensiz kod yazmanız muhtemeldir. – SLaks

+1

üst düzey paketler ne anlama geliyor? –

+1

Lütfen kodunuzu gönderin. Buradan çalışabiliriz. – Frank

cevap

25

Bir seferde yaklaşık 128 bayttan fazla bir RSA şifreleme şifre çözme kullanamazsınız. Verileri bölmeniz ve hemen hemen baytları dizgiyi String/Array olarak yazarken yapmalısınız. Tek sorunun, veri büyüklüğü ise, muhtemelen daha fazla gitmek için daha fazla yok. Sadece verileri bölüyorum.

büyük bir örnek, 128 bayttan büyük dizeleri ile ilgili sizin için muhtemelen daha tam: Genel olarak bir RSA şifreleme hakkında daha fazla açıklama gerekiyorsa http://coding.westreicher.org/?p=23

:

Aşağıdaki kod nasıl gösteriyor

// Get an instance of the RSA key generator 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
// Generate the keys — might take sometime on slow computers 
KeyPair myPair = kpg.generateKeyPair(); 

Bu, iki anahtar tutan bir keypair nesnesini verecektir: Java RSA anahtar çiftini oluşturmak için KeyPairGenerator kullanmak özel ve gecen neşriyata müracaat ic. Bu anahtarlardan yararlanmak için, ağ üzerinde sona erdireceğiniz verileri şifrelemek için SealedObject ile birlikte kullanılacak bir Cipher nesnesi oluşturmanız gerekecektir.

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher c = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key 
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

Cipher başlatılıyor sonra verileri şifrelemek için hazırsınız: Bunu şekli aşağıdaki gibidir. Şifrelemeden sonra ortaya çıkan veriler onları “çıplak” görürseniz pek bir anlam ifade etmeyecek, onları başka bir Nesnede saklamak zorundayız. Java, SealedObject sınıfı tarafından bunu sağlar. SealedObjects, bir Cipher nesnesi yardımıyla içeriklerini şifreleyen ve şifreleyen şifrelenmiş nesneler için konteynırlardır.

// Create a secret message 
String myMessage = new String("Secret Message"); 
// Encrypt that message using a new SealedObject and the Cipher we created before 
SealedObject myEncryptedMessage= new SealedObject(myMessage, c); 

elde edilen nesne korkmadan ağ üzerinden gönderilebilir, bu şifreli tarihi:

Aşağıdaki örnek oluşturmak ve bir SealedObject içeriğini şifrelemek için gösterir. Şifreyi çözebilen ve verileri alabilen tek kişi, özel anahtarı tutan kişidir. Normalde bu sunucu olmalı. İletinin şifresini çözmek için, Cipher nesnesini yeniden başlatmamız gerekecek, ancak bu kez farklı bir modla şifresini çözmemiz ve ortak anahtar yerine özel anahtarı kullanmamız gerekecektir.

Bu Java ile bunun nasıl olduğunu:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher dec = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key 
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate()); 

Şimdi Şifreleme şifresini çözmek için hazır olduğunu, biz tutulan verilerin şifresini çözmek için SealedObject söylemek gerekir. getObject yöntemini kullanarak zaman değil, o şifreleme önce olduğu sınıfın bir örneği (aslında bir dize örneği olsa bile) bir nesne örneğini döndürür beri

// Tell the SealedObject we created before to decrypt the data and return it 
String message = (String) myEncryptedMessage.getObject(dec); 
System.out.println("foo = "+message); 

', sana böylece dikkat Onu önceki formuna dökmek zorundayım. http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

RSA toplu veri şifreleme için uygun değildir: 'den

üzerindedir. Bunun yerine, "büyük dizginizi" şifrelemek için AES gibi bir simetrik şifreyi kullanın. Ardından, AES için kullanılan simetrik anahtarı RSA anahtarıyla şifreleyin.

BouncyCastle bunu yapmak için iki protokolü destekler: S/MIME ve PGP. Tüm hassas gizlilik protokolleri, bu şekilde anahtar taşıma veya anahtar değişimi için asimetrik algoritmalar kullanır.

RSA ile şifrelenebilecek mesaj boyutu, tuşun modülüne bağlıdır, bu mesajın güvenli bir şekilde doldurulması için gereken daha az bayttır.

+0

Hibrit şifreleme böyle devam etmenin yoludur. – CodesInChaos

+14

Bir API örneği veya ilgili API'ye bağlantı zarar vermez. – CodesInChaos

İlgili konular