2010-02-08 7 views
4

Je suis en train de chiffrer des données binaires en Java avec une clé publique tel que décrit sur cette page utile: http://www.junkheap.net/content/public_key_encryption_javaMon CipherOutputStream échoue silencieusement

Comme dirigé par la page, je crée des clés publiques et privées à l'aide des commandes :

openssl genrsa -aes256 -out private.pem 2048 
openssl rsa -in private.pem -pubout -outform DER -out public.der 

maintenant, je chiffrer enregistrer des données avec un petit programme:

public class Rsa { 

    public static void main(String[] args) throws Exception, IOException { 
     File keyFile = new File("public.der"); 
     byte[] encodedKey = new byte[(int) keyFile.length()]; 

     new FileInputStream(keyFile).read(encodedKey); 

     X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); 

     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PublicKey pk = kf.generatePublic(publicKeySpec); 

     Cipher rsa = Cipher.getInstance("RSA"); 

     rsa.init(Cipher.ENCRYPT_MODE, pk); 

     FileOutputStream fileOutputStream = new FileOutputStream(
       "encrypted.rsa"); 
     OutputStream os = new CipherOutputStream(fileOutputStream, rsa); 

     byte[] raw = new byte[245]; 
     raw[0] = 4; 

     os.write(raw); 
     os.flush(); 
     os.close(); 


    } 
} 

Le code ci-dessus fonctionne, mais wh fr Je change la taille du tableau d'octets en 246, cela produit un fichier de longueur nulle!

Qu'est-ce que je fais mal?

Répondre

5

CipherOutputStream a tendance à englober les exceptions générées par les objets Cipher et OutputStream qu'il enveloppe. L'implémentation Sun RSA ne chiffrera pas plus de M-11 octets, où M est la longueur en octets du module. Cela est vrai pour le PKCS1Padding par défaut, qui est ce que vous devez toujours utiliser, sauf si vous savez vraiment ce que vous faites. Vous pouvez spécifier NoPadding et ainsi obtenir les M octets complets. RSA n'est pas le bon choix pour le cryptage des données en masse. La méthode généralement acceptée pour chiffrer des données avec RSA consiste à générer une clé de session symétrique aléatoire K. par exemple. une clé AES, crypter les données avec l'algorithme symétrique avec K, puis crypter K en utilisant les clés RSA de tous les destinataires.

+0

Merci Greg - J'aurais aimé le savoir il y a 4 heures! – Mark

Questions connexes