Cryptage/Décryptage fichier

Fermé
aurelbobol6 - 16 janv. 2008 à 12:04
 ityuyuytu - 22 nov. 2011 à 15:56
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();
}
}
A voir également:

14 réponses

SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
17 janv. 2008 à 13:35
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.
6
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.
5
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
0
aurelbobol6 > yacine
24 mai 2008 à 11:01
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;
}
0
yacin > aurelbobol6
28 mai 2008 à 11:42
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
0
sawmi > aurelbobol6
15 janv. 2010 à 08:39
salut svp vous pouvez me donnez un exemple de code client /serveur qui crypte et décrypte un message avec l'algorithme rsa ,merci d'avence
0
bonjour svp je voudrai avoir le main de ce code puisqu'il marche bien comme tu as dis et merci
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
16 janv. 2008 à 12:10
Salut,
ou est-ce que tu décrypte, dans tout ça?
je ne vois aucun appel à ton cipherDecrypt
2
mais ca ne résout pas mon problème de BadPaddingException .. svp.merci
2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
16 janv. 2008 à 15:46
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
2
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(DashoA13*..)
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é.. :)
1
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..
1
S.V.P est ce que vous pouvez m'aider et me donner un code en Java de cryptage et décryptage un fichier texte
Merci
1
rtrtretretregfh
fg
fdg
fg
fd
gfd
g
fdg
fd
gf
dg
dfg
1
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.
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
16 janv. 2008 à 13:01
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é
0
Salut,

regarde le lien un peu plus haut, enfin le voici :

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

Il devrait t'aider. Si tu as encore des soucis n'hésite pas..

Aurèl
0
svp quelqu un peut m'expliquer le fonctionement du cryptage par decalage d'octet
0
Bonsoir ,
Je me demande si quelqu'un pourra m'aider je serai vraiment reconnaissante :)

je comprends trés bein la notion de clé privé et publique ;mais mon pbm c lors de l'implémentation ,j'ai deux résultats de retour L'exposant et le module mais j'arrive pas a comprendre comment je peux crypté le message et Le decrypté avec ses variables .

Merci de m'avoir répondre
0