A voir également:
- Cryptage/Décryptage fichier
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir fichier .bin - Guide
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
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.
si ça ça marche, c'est qu'effectivement tu as un écrasement mémoire.
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.
http://www.exampledepot.com/egs/javax.crypto/DesFile.html
en tout cas merci d'avoir pris du temps pour répondre a mes questions.
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;
}
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;
}
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
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
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
16 janv. 2008 à 12:10
Salut,
ou est-ce que tu décrypte, dans tout ça?
je ne vois aucun appel à ton cipherDecrypt
ou est-ce que tu décrypte, dans tout ça?
je ne vois aucun appel à ton cipherDecrypt
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
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
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
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é.. :)
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é.. :)
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..
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
Merci
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.
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.
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
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é
input = cipherCrypt.doFinal(buffer.array());
ce qui fait que tu ne fais que recrypter quelque chose qui a déjà été crypté
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
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
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
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