cryptage/décryptage fichier

aurelbobol6
cryptage/décryptage fichier

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 aps 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();
}
}

aurelbobol6

pardon le deuxième méthode start() est la suivante:
start("c:/temp/originalCrypte.exe", "c:/temp/originalNouveau.exe", cipherDecrypt);
mais ca ne change rien a mon problème

aurelbobol6

j'ai ENCORE lol oublié une erreur de modification dans la méthode start:

lihne 51: input = cipherCrypt.doFinal(buffer.array());
est remplacé par
input = cipher.doFinal(buffer.array());

et donc voici mon erreur

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)

pouvez vous m'aider svp..

fredericmazue

Ah Java.... décidément, on arrive pas à Cipher :twisted: :lol:

aurelbobol6
deleze

Le tableau de byte dans le buffer n'est pas forcément complet lors de la lecture de la dernière partie du fichier.

input = cipherCrypt.doFinal(buffer.array(), 0, nombreLu);