/*
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
*/
|
package com.megatim.module.encryption.impl;
|
|
import com.megatim.module.encryption.ifaces.EncryptionFace;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.nio.charset.StandardCharsets;
|
import java.nio.file.Files;
|
import java.security.InvalidKeyException;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.KeySpec;
|
import java.util.Base64;
|
import java.util.logging.Level;
|
import java.util.logging.Logger;
|
import javax.crypto.BadPaddingException;
|
import javax.crypto.Cipher;
|
import javax.crypto.IllegalBlockSizeException;
|
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKeyFactory;
|
import javax.crypto.spec.PBEKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
|
/**
|
*
|
* @author STEPHANIE
|
*/
|
public class AESImpl implements EncryptionFace {
|
|
private static final String SALT = "hdbgshdbvnc";
|
private static final String HASH_ALGORITHM = "PBKDF2WithHmacSHA256";
|
private static final String ALGORITHM = "AES";
|
private static final int HASH_ITERATIONS = 65536;
|
|
/**
|
* Fonction qui sert à chiffrer
|
*
|
* @param inputPath : chemin vers le fichier à chiffrer
|
* @param keyLength : {128,192,256}
|
* @param outputPath : chemin vers le resutlat du chiffrement
|
* @param password : clé de chiffrement
|
*/
|
@Override
|
public void encryptFile(String password, int keyLength, String inputPath, String outputPath) throws Exception {
|
File file = new File(inputPath);
|
|
cryptOrDecryptFile(Cipher.ENCRYPT_MODE, password, keyLength, file, new File(outputPath));
|
}
|
|
/**
|
* Fonction qui sert à déchiffrer
|
*
|
* @param inputPath : chemin du fichier à déchiffrer
|
* @param keyLength
|
* @param outputPath : chemin où stocké le resultat du déchiffrement
|
* @param password : clé de déchiffrement
|
* @throws java.lang.Exception
|
*/
|
@Override
|
public void decryptFile(String password, int keyLength, String inputPath, String outputPath) throws Exception {
|
File file = new File(inputPath);
|
|
/* Déchiffre le fichier */
|
cryptOrDecryptFile(Cipher.DECRYPT_MODE, password, keyLength, file,
|
new File(outputPath));
|
}
|
|
|
private void cryptOrDecryptFile(int mode, String password, int keyLength, File inputFile, File outputFile)
|
throws InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException,
|
NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException {
|
|
SecretKey secret = getKeyFromPassword(password, SALT, keyLength);
|
/* Utilisation de l'algorithme AES */
|
Cipher aesCipher = Cipher.getInstance(ALGORITHM);
|
aesCipher.init(mode, secret);
|
|
if (!outputFile.exists()) {
|
Files.createFile(outputFile.toPath());
|
}
|
|
FileInputStream inputStream = new FileInputStream(inputFile);
|
FileOutputStream outputStream = new FileOutputStream(outputFile);
|
|
byte[] buffer = new byte[64];
|
int bytesRead;
|
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
byte[] output = aesCipher.update(buffer, 0, bytesRead);
|
if (output != null) {
|
outputStream.write(output);
|
}
|
}
|
byte[] outputBytes = aesCipher.doFinal();
|
if (outputBytes != null) {
|
outputStream.write(outputBytes);
|
}
|
inputStream.close();
|
outputStream.close();
|
}
|
|
/**
|
* Méthode servant à générer une clé secrète à partir du mot de passe de
|
* l'utilisateur
|
*
|
* @param password : mot de passe à partir duquel on veut générer la clé
|
* sécrète
|
* @param salt : valeur servant à renforcer la sécurité de la clé sécrète
|
* @param keylength : longueur de la clé en bit
|
* @return
|
* @throws NoSuchAlgorithmException
|
* @throws InvalidKeySpecException
|
*/
|
private SecretKey getKeyFromPassword(String password, String salt, int keylength)
|
throws NoSuchAlgorithmException, InvalidKeySpecException {
|
|
SecretKeyFactory factory = SecretKeyFactory.getInstance(HASH_ALGORITHM);
|
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), HASH_ITERATIONS, keylength);
|
SecretKey secret = new SecretKeySpec(factory.generateSecret(spec)
|
.getEncoded(), ALGORITHM);
|
return secret;
|
}
|
|
@Override
|
public String encryptString(String password, int keyLength, String strToEncrypt) {
|
|
try {
|
SecretKey secret = getKeyFromPassword(password, SALT, keyLength);
|
|
/* Utilisation de l'algorithme AES */
|
Cipher aesCipher = Cipher.getInstance(ALGORITHM);
|
aesCipher.init(Cipher.ENCRYPT_MODE, secret);
|
|
/* Chiffre la chaine de charactères */
|
return Base64.getEncoder().encodeToString(aesCipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
|
} catch (Exception ex) {
|
Logger.getLogger(AESImpl.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
|
return "";
|
}
|
}
|
|
@Override
|
public String decryptString(String password, int keyLength, String strToDecrypt) {
|
|
try {
|
SecretKey secret = getKeyFromPassword(password, SALT, keyLength);
|
|
/* Utilisation de l'algorithme AES */
|
Cipher aesCipher = Cipher.getInstance(ALGORITHM);
|
aesCipher.init(Cipher.DECRYPT_MODE, secret);
|
|
/* Déchiffre le fichier */
|
return new String(aesCipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
|
|
} catch (Exception ex) {
|
Logger.getLogger(AESImpl.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
|
return "";
|
}
|
}
|
}
|