2011-05-20 21 views
10

Basit bir "String" testini ileri geri kodlamaya çalışıyorum.Java RSA Şifreleme

: şifreleme gayet güzel çalışıyor olsa

public static String encode(Key publicKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    byte[] byteData = data.getBytes(); // convert string to byte array 

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); // initialize object's mode and key 

    byte[] encryptedByteData = cipher.doFinal(byteData); // use object for encryption 

    return new String(encryptedByteData); // convert encrypted byte array to string and return it 

} 

public static String decode(Key privateKey, String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    byte[] byteData = data.getBytes(); // convert string to byte array 

    Cipher cipher = Cipher.getInstance(ALGORITHM); // create conversion processing object 
    cipher.init(Cipher.DECRYPT_MODE, privateKey); // initialize object's mode and key 

    System.out.println(byteData.length); 

    byte[] decryptedByteData = cipher.doFinal(byteData); // use object for decryption 

    return new String(decryptedByteData); // convert decrypted byte array to string and return it 

} 

Ancak, ben sadece "test" şifreleyerek dan aldık dize şifresini çözmek için çalışırken, ben hariç şu olsun (ALGORITMASı "RSA" dır) javax.crypto.IllegalBlockSizeException: Veriler 256 byte

bunu deşifre edebilmek amacıyla 256 parçaları içinde şifrelenmiş bayt bölünmüş Should daha uzun olmamalıdır? here kaynaktan

cevap

9

Rasgele baytları String numaralı telefona güvenle dönüştüremezsiniz. Sonuçlar, varsayılan karakter kodlamanızın, bunu çalıştırdığınız makinede ne olduğuna bağlı olacaktır. Birçok kodlamayla şifre metni bozulur ve bilgi kaybolur.

'doFinal() `yöntemin bir byte[] yerine (sonucu uygulamak için kodunuzu değiştirin.

sen, bir karakter dizesine byte[] dönüştürmek Baz-64 gibi bir kodlama kullanmanız gerekiyorsa.

+0

Ah, mükemmel, teşekkürler, mükemmel çalışıyor! Evet, sanırım şifreli bayt dizisini bir String'e dönüştürdüğümde bozulma. – arik

4

:

sekiz eksi on dolgu bayt ile bölünmüş bit RSA anahtar uzunluğunun maksimum bayt uzunluğu maksimum bayt yani sayıda verileri şifrelemek RSA algoritması = anahtar bit büyüklüğü/8 - 11. Daha büyük verileri şifrelemek istiyorsanız, daha büyük bir anahtar kullanın, örneğin, 4096 bit içeren bir anahtar 501 bayt veriyi şifrelemenize olanak tanır.

+1

Cümlenin bir Google arama sonucuyla aynı ifadede okumasına rağmen, anahtarı daha yükseğe ayarlamak benim için çalışmadı. Şifrelemenin bayt dizisi uzunluğunu test ettim ve anahtar uzunluğunu 2048'den 4096'ya yükselttikten sonra bayt dizisi uzunluğunun her iki durumda da uygun olmadığını fark ettim, her iki durumda da istisna aldım. – arik

3

Uzun bir verileriniz varsa, bunları her birine sığdırıp şifrelemek/şifresini çözmek (bu kadar iyi bir fikir değil) veya simetrik bir algoritma (AES/DES/RC4/etc) kullanarak şifrelemek/şifresini çözmeniz gerekir. .), simetrik anahtarı RSA ortak anahtarıyla şifreleyin ve diğer tarafa da gönderin (çok daha iyi bir fikir)

İkinci yaklaşım çok yaygın bir yaklaşımdır çünkü asimetrik şifreleme algoritmaları simetrik algoritmalardan çok daha pahalıdır (hem şifreleme hem de şifre çözme için).

+0

Teşekkürler. Veriler gerçekte sınırı aştığında yapacağım, ancak sorunun, "test" gibi basit bir dizgeyi şifrelediğinde ortaya çıkmamasıdır. – arik

+0

Evet, sorunuzu yanlış anladım, ama bence bu gelecek için iyi bir tavsiyedir. İyi şanslar! – MByD