Ho il seguente problema: ogni utente ha un password che, a discrezione dell'utente stesso, può essere salvata e quindi scritta su un file che contiene tutte le proprietà del profilo di quell'utente.
Ho quindi la prima necessità di criptare la password da salvare.

Ho poi la seconda necessità di decriptare la password dopo averla letta dal file medesimo per motivi di autenticazione con un webservice.


Ho cercato su internet e su questo forum, ed in quest'ultimo ho trovato il seguente codice riportata in una vecchia discussione:

codice:
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

public class Crypt {
  Cipher ecipher;
  Cipher dcipher;
  
  // 8-byte Salt
  byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
                (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
  };
  
  // Iteration count
  int iterationCount = 19;
  
  public Crypt(String passPhrase) {
    try {
      // Create the key
      KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
      SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
      ecipher = Cipher.getInstance(key.getAlgorithm());
      dcipher = Cipher.getInstance(key.getAlgorithm());

      // Prepare the parameter to the ciphers
      AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
  
      // Create the ciphers
      ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
      dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
    } catch (java.security.InvalidAlgorithmParameterException e) {
    } catch (java.security.spec.InvalidKeySpecException e) {
    } catch (javax.crypto.NoSuchPaddingException e) {
    } catch (java.security.NoSuchAlgorithmException e) {
    } catch (java.security.InvalidKeyException e) {
    }
  }
  
  public String encrypt(String str) {
    try {
      // Encode the string into bytes using utf-8
      byte[] utf8 = str.getBytes("UTF8");
  
      // Encrypt
      byte[] enc = ecipher.doFinal(utf8);
  
      // Encode bytes to base64 to get a string
      return new sun.misc.BASE64Encoder().encode(enc);
    } catch (javax.crypto.BadPaddingException e) {
    } catch (IllegalBlockSizeException e) {
    } catch (UnsupportedEncodingException e) {
    } catch (java.io.IOException e) {
    }
    return null;
  }
  
  public String decrypt(String str) {
    try {
      // Decode base64 to get bytes
      byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
  
      // Decrypt
      byte[] utf8 = dcipher.doFinal(dec);
  
      // Decode using utf-8
      return new String(utf8, "UTF8");
    } catch (javax.crypto.BadPaddingException e) {
    } catch (IllegalBlockSizeException e) {
    } catch (UnsupportedEncodingException e) {
    } catch (java.io.IOException e) {
    }
    return null;
  }
}

Prendendo spunto da questo codice, ho cercato di adeguarlo alle mie esigenze, in questo modo:

codice:
public class Crypt {

    Cipher ecipher;
    Cipher dcipher;

    // 8-byte Salt
    byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
                    (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
                   };

    // Iteration count
    int iterationCount = 19;
    
    public Crypt(){};

      public String encrypt(String str) {
        try {

          // Create the key
            KeySpec keySpec = null;
          for(int i=0; i < 100; i++){
              keySpec = new PBEKeySpec(str.toCharArray(), salt, iterationCount);
              System.out.println("La keySpec è " + keySpec);
          }
          
          SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
          ecipher = Cipher.getInstance(key.getAlgorithm());
          dcipher = Cipher.getInstance(key.getAlgorithm());

          // Prepare the parameter to the ciphers
          AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

          // Create the ciphers
          ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
         //dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
        try {
          // Encode the string into bytes using utf-8
          byte[] utf8 = str.getBytes("UTF8");

          // Encrypt
          byte[] enc = ecipher.doFinal(utf8);

          // Encode bytes to base64 to get a string
          return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
      }

      public String decrypt(String str) {

         try {
          // Create the key
          KeySpec keySpec = new PBEKeySpec(str.toCharArray(), salt, iterationCount);
          SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
//          ecipher = Cipher.getInstance(key.getAlgorithm());
          dcipher = Cipher.getInstance(key.getAlgorithm());

          // Prepare the parameter to the ciphers
          AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

          // Create the ciphers
//          ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
          dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
        try {
          // Decode base64 to get bytes
          byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

          // Decrypt
          byte[] utf8 = dcipher.doFinal(dec);

          // Decode using utf-8
          return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
      }
In questo modo mi salva sul file la password criptata, ma quando cerco di decriptarla, mi restituisce null.

Qualcuno mi può aiutare a capire come devo modificare questo codice in base a quello che serve a me?