IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lecture/écriture d'un buffer pour crypter un fichier vidéo


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut Lecture/écriture d'un buffer pour crypter un fichier vidéo
    Bonjour à tous,

    Je cherche à développer en JAVA un moyen de crypter un fichier mp4. J'utilise pour cela la classe CryptoUtils, qui fonctionne bien pour des fichiers légers.

    Par contre, dès que j'essaye de passe des fichiers un peu plus lourds, ça bloque, au niveau du chargement dans un buffer de la taille du fichier (beaucoup trop lourd pour la JVM).

    Je cherche donc un moyen d'optimiser cette gestion de buffers en intervenant sur la fonction 'doCrypto' : j'aimerais découper l'opération en manipulant des buffers de plus petite taille, mais je n'ai pas trouvé le moyen de faire ça (découpage, reconstitution pour le flux sortant, etc...)

    Quelqu'un aurait-il une idée ?

    J'utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.Buffer;
    import java.nio.ByteBuffer;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
     
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.SecretKeySpec;
     
    public class CryptoUtils {
    	private static final String ALGORITHM = "AES";
    	private static final String TRANSFORMATION = "AES";
     
    	public static void encrypt(String key, File inputFile, File outputFile) throws CryptoException {
    		doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
    	}
     
    	public static void decrypt(String key, File inputFile, File outputFile) throws CryptoException {
    		doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
    	}
     
    	private static void doCrypto(int cipherMode, String key, File inputFile, File outputFile) throws CryptoException {
    		try {
    			Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
    			Cipher cipher = Cipher.getInstance(TRANSFORMATION);
    			cipher.init(cipherMode, secretKey);
     
    			FileInputStream inputStream = new FileInputStream(inputFile);
     
    			long IFLength = inputFile.length();
     
    			// Quelque chose à faire ICI :)
     
    			byte[] inputBytes = new byte[(int) IFLength];
    			int nbLecture;
    			while ((nbLecture = inputStream.read(inputBytes)) != -1) {
    				inputStream.read(inputBytes, 0, nbLecture);
    			}
     
    			byte[] outputBytes = cipher.doFinal(inputBytes);
     
    			FileOutputStream outputStream = new FileOutputStream(outputFile);
    			outputStream.write(outputBytes);
     
    			inputStream.close();
    			outputStream.close();
     
    		} catch (Exception ex) {
    			throw new CryptoException("Error encrypting/decrypting file", ex);
    		}
    	}
    }

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Salut,

    Le meilleur moyen c'est d'utiliser un CipherInputStream.

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Hello,

    Tu as regardé du coté de la classe CipherInputStream ? Ca donnerai un truc du genre (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FileInputStream inputStream = new FileInputStream(inputFile);
    CipherInputStream cis = new CipherInputStream(inputStream, cipher);
    FileOutputStream outputStream = new FileOutputStream(outputFile);
    byte[] inputBytes = new byte[2048]; // J'imagine qu'un plus gros buffer accelerera le cryptage
    int nbLecture;
    while ((nbLecture = cis.read(inputBytes)) != -1)
    {
       outputStream.write(inputBytes, 0, nbLecture);
    }
    inputStream.close();
    outputStream.flush();
    outputStream.close();

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Merci pour vos réponses

    @chtig : Je regarde ça de plus près !

    @hwoarang : J'ai testé ton code, j'avais déjà essaye quelque chose de comparable mais sans CipherInputStream. Le problème c'est que cela ne va agir que sur une petite partie du fichier, qui est celle qu'on a donnée au buffer. Du coup il me fait ça bien, mais seulement sur 2 ko du fichier :/

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh ? Ben du coup fais donc plutôt la même chose avec CipherInputStream.

    Comme tu peux le constater, dans ce code le fichier entier passe par le buffer (et surtout, par le CipherInputStream) et donc passe entièrement à la crypto.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Il se passe la même chose !

    J'ai du rater un truc parce que là...

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    "Il se passe" quoi exactement, et avec quel code ou quel code exactement ?
    Parce que j'ai du mal à comprendre ce qui te gêne au juste.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Lecture/écriture des fichiers typés avec Delphi pour .NET
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/02/2013, 12h20
  2. Réponses: 2
    Dernier message: 11/04/2012, 15h12
  3. Réponses: 2
    Dernier message: 02/02/2010, 11h17
  4. Lecture/écriture des informations/tags "Avancé" d'un fichier.
    Par B@rberousse dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 03/07/2007, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo