rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Cryptage/Décryptage fichier

Posté par aurelbobol6, le mercredi 16 janvier 2008 à 12:04:07
Bonjour, voila j'ai fais un petit programme pour copier deux fichiers. J'ai un fichier "original.exe" et je le crypte en "originalCrypte.exe", jusque la tout vas bien, la copie s'est bien déroulée.. mais lorsque je souhaite décrypter mon fichier "originalCrypte.exe" pour le copier à "originalNouveau.exe", j'ai un BadPaddingException qui se passe et je ne sais pas trop quoi faire.
J'ai fais quelques recherche a ce sujet et j'ai vu qu'il fallait utiliser il me semble cipher.getBlockSize() et cipher.getOutputSize(arg0) mais je n'ai pas tout compris.
Autre petit détail, mon fichier original fait 5,02Mo, le originalCrypte fait 5,06Mo et le fichier originalNouveau 5,10Mo.
Je vous ai laissé mon code, si quelqu'un peut m'aider, ce serait vraiment sympa et super arrangeant. Merci d'avance

import ....

public class TestClass {
private static Cipher cipherCrypt = null;
private static Cipher cipherDecrypt = null;
private static SecretKey key = null;

public static void main(String[] args) {
try {
byte[] cle = (new String("password")).getBytes(); // 24 caractères
key = new SecretKeySpec(cle, "Blowfish");
cipherCrypt = Cipher.getInstance("Blowfish");
cipherDecrypt = Cipher.getInstance("Blowfish");
cipherCrypt.init(Cipher.ENCRYPT_MODE, key);
cipherDecrypt.init(Cipher.DECRYPT_MODE, key);

start("c:/temp/original.exe", "c:/temp/originalCrypte.exe", cipherCrypt);
start("c:/temp/originalCrypte.exe", "c:/temp/originalNouveau.exe", cipherCrypt);
}catch(Exception e) {
e.printStackTrace();
}
}

private static void start(String entree, String sortie, Cipher cipher) throws IOException, IllegalBlockSizeException, BadPaddingException
{
byte[] input ;
FileInputStream fIn = new FileInputStream(entree);
FileOutputStream fOut = new FileOutputStream(sortie);
FileChannel canalIn = fIn.getChannel();
FileChannel canalOut = fOut.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int nombreLu = 0;
while (nombreLu != -1) {
buffer.clear();
nombreLu = canalIn.read(buffer);
if (nombreLu !=-1) {
buffer.flip();
input = cipherCrypt.doFinal(buffer.array());
canalOut.write(ByteBuffer.wrap(input));
}
}
canalIn.close();
canalOut.close();
fIn.close();
fOut.close();
}
}
Configuration: Windows XP
Firefox 2.0.0.11
Répondre à aurelbobol6  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
SebManfred, le mercredi 16 janvier 2008 à 12:10:39
Salut,
ou est-ce que tu décrypte, dans tout ça?
je ne vois aucun appel à ton cipherDecrypt
Répondre à SebManfred

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le mercredi 16 janvier 2008 à 12:15:13
oui pardon j'ai refait quelques test et j'ai oublié de changé.
le deuxième appel de la méthode start() est:
start("c:/temp/originalCrypte.exe", "c:/temp/originalNouveau.exe", cipherDecrypt);
mais ce ne change rien a tout ce que j'ai expliqué.encore dsl.
Répondre à aurelbobol6

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le mercredi 16 janvier 2008 à 12:35:39
mais ca ne résout pas mon problème de BadPaddingException .. svp.merci
Répondre à aurelbobol6

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
SebManfred, le mercredi 16 janvier 2008 à 13:01:47
sauf que dans ta fonction start, tu ne te sers pas du cipher que tu passe en paramètres mais de la ligne
input = cipherCrypt.doFinal(buffer.array());
ce qui fait que tu ne fais que recrypter quelque chose qui a déjà été crypté
Répondre à SebManfred

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le mercredi 16 janvier 2008 à 13:26:33
oui c'est erreurs de modifications...
voici mon nouveau code:

public class TestClass {
private static Cipher cipherCrypt = null;
private static Cipher cipherDecrypt = null;
private static SecretKey key = null;

public static void main(String[] args) {
try {
byte[] cle = (new String("password")).getBytes(); // 24 caractères
key = new SecretKeySpec(cle, "Blowfish");
cipherCrypt = Cipher.getInstance("Blowfish");
cipherDecrypt = Cipher.getInstance("Blowfish");
cipherCrypt.init(Cipher.ENCRYPT_MODE, key);
cipherDecrypt.init(Cipher.DECRYPT_MODE, key);

start("c:/temp/original.exe", "c:/temp/originalCrypte.exe", cipherCrypt);
start("c:/temp/originalCrypte.exe", "c:/temp/originalNouveau.exe", cipherDecrypt);
}catch(Exception e) {
e.printStackTrace();
}
}

private static void start(String entree, String sortie, Cipher cipher) throws IOException, IllegalBlockSizeException, BadPaddingException
{
byte[] input ;
FileInputStream fIn = new FileInputStream(entree);
FileOutputStream fOut = new FileOutputStream(sortie);
FileChannel canalIn = fIn.getChannel();
FileChannel canalOut = fOut.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int nombreLu = 0;
while (nombreLu != -1) {
buffer.clear();
nombreLu = canalIn.read(buffer);
if (nombreLu !=-1) {
buffer.flip();
input = cipher.doFinal(buffer.array());
canalOut.write(ByteBuffer.wrap(input));
}
}
canalIn.close();
canalOut.close();
fIn.close();
fOut.close();
}
}




avec ce problème
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA1­3*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at TestClass.start(TestClass.java:51)
at TestClass.main(TestClass.java:31)


la ligne 51: input = cipher.doFinal(buffer.array());

excuse moi, donc voici mon problème en mieux exposé.. :)
Répondre à aurelbobol6

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
SebManfred, le mercredi 16 janvier 2008 à 15:46:28
tu es sur de ton buffer?
tu dis que tu as un fichier de 5Mo, et un buffer de 1024 octets pour le traiter...
ça me parait bizarre
un p'tit écrasement mémoire ne m'étonnerait pas outre mesure...

tu devrais faire un test sur la taille du fichier à crypter/décrypter avant de charger ton buffer
Répondre à SebManfred

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le jeudi 17 janvier 2008 à 12:44:36
oui oui je suis sur car je réussi a faire une copie du fichier original à un autre (donc sans cryptage).. cela me permet enfait de faire des copies de gros fichiers. donc je ne pense pas que ce la viennent de la..
Répondre à aurelbobol6

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
SebManfred, le jeudi 17 janvier 2008 à 13:35:25
essaie de ne faire que crypter ton fichier, pour obtenir le fichier crypté, puis le programme s'arrête, puis tu modifie ton programme pour décrypter ton fichier crypté, pour voir ce que ça donne.
si ça ça marche, c'est qu'effectivement tu as un écrasement mémoire.
Répondre à SebManfred

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le vendredi 18 janvier 2008 à 10:01:23
voila j'ai trouvé un code qui marche, je te donne la source :

http://www.exampledepot.com/egs/javax.crypto/DesFile.html

en tout cas merci d'avoir pris du temps pour répondre a mes questions.
Répondre à aurelbobol6

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
yacine, le vendredi 23 mai 2008 à 14:43:04
bonjour, j'ai eu le meme problème que toi concernat le decryptage de certain mot de passe, alors pourriez tu me dire comment t'as résolu ton problème. Merci beacoup pour votre aide
Répondre à yacine

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
aurelbobol6, le samedi 24 mai 2008 à 11:01:51
salut yacine,

pour le cryptage/decryptage pour le fichier --> cf le lien que j'ai mis dans le post au dessus et sinon pour les mots de passe, tu peux utiliser un cryptage RSA (système de clé publique, clé privé). Si tu as une application client-serveur et que tu souhaites que le mot de passe transmis soit chiffré, il faut tout d'abord généré une paire de clé. Ensuite le serveur envoie la clé publique au client et le client crypte le message avec crypterMessage(String messageEnClair, BigInteger exponentDeLaClefPublic, BigInteger modulusDeLaClefPublic). Le serveur décypte avec sa clé privé que lui seul connait. N'héiste pas a me redemander si t'as pas compris.. Voici le code que j'ai fait pour ca:

package security;

import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

/*
* Cette classe concerne le cryptage du password
*/

public class Crypto_Message_RSA {

/*--------------------------------------------------*\
|* Constructeur *|
\*--------------------------------------------------*/


public Crypto_Message_RSA(){
/*
* Le constructeur va permettre de générer les clés privés et publiques
*/
try {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA" );
keyPairGen.initialize(TAILLE_CLEF, new SecureRandom(new String("toto").getBytes()));
pair = keyPairGen.generateKeyPair();
}
catch (Exception e) {System.out.println(e);}
// récupération des clefs
clefPublique = (RSAPublicKey)pair.getPublic();
clefPrivee = (RSAPrivateKey)pair.getPrivate();
}

/*--------------------------------------------------*\
|* Méthodes publics *|
\*--------------------------------------------------*/


public String decrypterMessage(String messageCrypte) {
//On repasse le tableau d'octets en BigInteger pour pouvoir le décrypter
BigInteger msgADecrypteEnBigInt = new BigInteger(messageCrypte);

//on décrypte le message grace au RSA et a la clef privée
BigInteger msgDecrypteEnBigInt = msgADecrypteEnBigInt.modPow(clefPrivee.getPrivateExponent(),­ clefPrivee.getModulus());

//on repasse le message en octets pour pouvoir retirer l'octet qu'on lui avait ajouté
byte[] msgDecrypteEnOctets = msgDecrypteEnBigInt.toByteArray();

//on lui retire son octet en plus
byte[] resultat = new byte[msgDecrypteEnOctets.length-1];
for (int i = 0; i < resultat.length; i++) {
resultat[i] = msgDecrypteEnOctets[i+1];
}

//on retourne une chaine de charactères qui provient du tableau d'octets transformé
return new String (resultat);
}

public static String crypterMessage(String message, BigInteger exponent, BigInteger modulus) {
// transformation de la chaine en tableau d'Octets
byte[] msgEnOctets = message.getBytes();

//ajoute un octet codant le "1" au début du tableau passé en parametres
byte[] resultat = new byte[msgEnOctets.length+1];
resultat[0] = 1;
for (int i = 0; i < msgEnOctets.length; i++) {
resultat[i+1] = msgEnOctets[i];
}

BigInteger msgEnBigInteger = new BigInteger(resultat);

//crypte le message par la méthode RSA grace a la clef publique (cela renvoi un BigInteger)
BigInteger msgCrypte = msgEnBigInteger.modPow(exponent, modulus);

//on retourne le message crypté sous la forme d'un tableau d'octets
return msgCrypte.toString();
}

public RSAPrivateKey getClePrive()
{
return clefPrivee;
}

public RSAPublicKey getClePublic()
{
return clefPublique;
}

/*--------------------------------------------------*\
|* Attributs *|
\*--------------------------------------------------*/


private KeyPair pair;
private RSAPublicKey clefPublique;
private static RSAPrivateKey clefPrivee;
private final static int TAILLE_CLEF = 1024;
}
Répondre à aurelbobol6

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 yacin, le mercredi 28 mai 2008 à 11:42:16
bonjour,
voila j'utilise la classe cipher pour crypter des mots de passe, avec l'algorithme AES (c'est un cryptage symétrique), j'ai un problème lors de decryptage de certains mot de passe (uniquement pour certains), c'est à dire j'arrive à crypter tout les mots de passes, par contre lors de la phase de decryptage certains mots de passes y a une exception qui est générée:
voici mon programme :

SecretKey key = (bien initialisée);
Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
aesCipher.init(mode, key);
byte[] motCrypte = aesCipher.doFinal(text.getBytes()); //problème à ce niveau

et voici l'exception générée (pour certains mots de passes non acceptés):
javax.crypto.BadPaddingException: Given final block not properly padded

j'ai fait des recherches sur internet et sur ces forums (le problème est toujours posé mais j'ai pas trouvé de réponse concrète), j'ai essayé les méthodes qui ont été proposées (utilisé une boucle de lecture de bits), mais toujours c'est le même pas cas pour ces mots non acceptés.
merci beaucoups
Répondre à yacin
Logiciels pertinents trouvés dans les téléchargements
Télécharger GPG 1.4.7GPG - GPG (GNU privacy guard) est une alternative libre au logiciel PGP. Ce logiciel permet de chiffrer des documents avec un haut...Catégorie: Chiffrement
Licence: Open Source
Télécharger Crypt For Free 4.7.8Crypt For Free - c'est un utilitaire gratuit de cryptage de données.Vous pourrez crypter vos fichier en utilisant trois algorithmes de...Catégorie: Sécurité
Licence: Freeware/gratuit
Télécharger PDF Creator 0.9.5PDF Creator - PDF Creator est un outil gratuit permettant de créer des PDF à partir de presque n'importe quelle application capable...Catégorie: PDF
Licence: Open Source
Télécharger AxCrypt 1.6.4.4AxCrypt - AxCrypt est un logiciel de chiffrement (encryption) permettant de protéger par mot de passe des fichiers ou des dossiers...Catégorie: Chiffrement
Licence: Open Source
Plus de logiciels gratuits sur « Cryptage/Décryptage fichier »