2013-05-14 32 views
5

java'da şifreleme ve şifre çözme dosyasına CipherOutputStream10 kullanıyorum, ancak giriş dosyası> 117 byte şifreleme yapamıyor. RSA algoritması ortak anahtar uzunluğu 1024 bayt kullanıyorum. Dosya Şifreleme ve Şifre Çözme Nasıl Yapılır?

cipher.init(Cipher.ENCRYPT_MODE, secKey); 

String cleartextFile = "cleartext.txt"; 
String ciphertextFile = "ciphertextSymm.txt"; 

FileInputStream fis = new FileInputStream(cleartextFile); 
FileOutputStream fos = new FileOutputStream(ciphertextFile); 
CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

byte[] block = new byte[8]; 
int i; 
while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
} 
cos.close(); 

nasıl input dosya uzunluğu> 117 byte şifrelemenin?

+5

vay, bu harika: Burada

genel sürecini gösteren bir kod parçasıdır. Soru nedir? Dosyaları şifrelemek için –

+3

RSA ** değil ** tasarlanmıştır. Dosyanızı şifrelemek için simetrik bir algoritma (AES, Blowfish, vb.) Kullanın ve simetrik şifrelemeye ihtiyacınız varsa, sadece bu simetrik anahtarda RSA kullanın. – zakinster

cevap

21

RSA kullanarak bir dosyayı şifreleyemezsiniz, çünkü RSA (daha kesin olması için, uygulamasının Java'da RSA), anahtarın uzunluğundan daha fazla veriyi şifrelemenize izin vermez. 1024 bit anahtar için, yalnızca 128 baytlık (aslında doldurma nedenleriyle biraz daha az) 1024 bit şifreleyebilirsiniz.

Her durumda, , iki ana nedenden ötürü bir kamu anahtar algoritması (asimetrik kriptografi) kullanarak büyük bir veri parçasını şifrelemek kötü bir uygulamadır.

  1. The

    RSA kullanılarak büyük miktarda veri şifrelemek için hiçbir pratik uygun ve güvenli kriptografik mod/dolgu olan (yani o yapmak gerçekten güvenli değildir). Ortak anahtar algoritmaları güvenli olması için büyük bir anahtar gerektirir (1024 bit, 2048 bit) ve bu nedenle simetrik anahtar algoritmalarından çok daha yavaştır (yalnızca 128 - 256 bit anahtarın güvenli olmasını gerektirir).

size bu iki büyük stacktexchange yayınlarını görmek, büyük miktarlarda veri şifrelemek için yalnızca RSA kullanmamalısınız neden daha fazla detay isterseniz:

Çok miktarda veriyi şifrelemek istiyorsanız, ilerlemenin standart yolu bir oturum anahtarı oluşturmaktır (şifreleme ically güvenli rasgele sayı bir kez kullanılır). Oturum anahtarını ortak anahtarla şifrelersiniz. Daha sonra şifrelenmemiş oturum anahtarını kullanarak dosyayı (büyük miktarda veri) bir simetrik algoritma (böyle AES) ile şifrelersiniz. Daha sonra şifreli oturum anahtarını ve şifrelenmiş verileri son dosyada bir arada saklarsınız. Şifrelenmiş bir posta gönderdiğinde PGP (veya GnuPG) bu şekilde devam eder. SSL/TLS de benzer şekilde çalışır.

Son olarak, kriptografi doğru bir şekilde karmaşıktır (hemen hemen her şey bir güvenlik kusuru oluşturabilir: şifreleme modları, doldurma, vb.). Bu nedenle, çok dikkatli olmanızı ve kodunuzun gözden geçirilmesini sağlamanızı tavsiye ederim. kripto konularda bilgili biri tarafından.

// 1. Generate a session key 
KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(128) 
SecretKey sessionKey = keyGen.generateKey(); 

// 2. Encrypt the session key with the RSA public key 
Cipher rsaCipher = Cipher.getInstance("RSA"); 
rsaCipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey) 
byte[] encryptedSessionKey = rsaCipher.doFinal(sessionKey.getEncoded()); 

// 3. Encrypt the data using the session key (unencrypted) 
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
aesCipher.init(Cipher.ENCRYPT_MODE, sessionKey); <-- sessionKey is the unencrypted 
//             session key. 
// ... use aesCipher to encrypt your data 

// 4. Save the encrypted data along with the encrypted 
// session key (encryptedSessionKey). 
// PLEASE NOTE THAT BECAUSE OF THE ENCRYPTION MODE (CBC), 
// YOU ALSO NEED TO ALSO SAVE THE IV (INITIALIZATION VECTOR). 
// aesCipher.aesCipher.getParameters(). 
//  getParametersSpec(IvParameters.class).getIV(); 
+0

Bu gönderide, RSA'nın neden büyük verileri şifrelemek için kullanılmadığı açıklanır (verimlilik nedenini dikkate almaz): http://crypto.stackexchange.com/a/126/6933 – nhahtdh

+0

Başka bir ilgili soru: http: //crypto.stackexchange.com/sorular/2789/is-rsa-in-a-ECB-benzeri mod güvenli-için-toplu-şifreleme – nhahtdh

+0

@nhahtdh: Bulduğunuz iki mesaj çok ilginç düşünün, benim post onları bağlamak için gidiyorum (tabii ki size kredi verir). – Xion345

İlgili konular