Criptografia AES

5 respostas
F

Eu criei um código de criptografia no serviço pois estou precisando encriptografar e descriptografar algun dados e estou usando o algoritmo AES. Porem estou tendo problemas para descriptografar, e ocorre o erro : Illiega key size, quando eu tento descriptografar de outra maquina.

Segue o código abaixo:

import java.io.File;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.util.Properties;
import java.util.Scanner;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; 

public class CryptoUtils {
  
  public static final String AES = "AES";
  
  /**
   * encrypt a value and generate a keyfile 
   * if the keyfile is not found then a new one is created
   * @throws GeneralSecurityException 
   * @throws IOException 
   */
  public static String encrypt(String value, File keyFile)
  throws GeneralSecurityException, IOException 
  {
    if (!keyFile.exists()) {
      KeyGenerator keyGen = KeyGenerator.getInstance(CryptoUtils.AES);
      keyGen.init(128);
      SecretKey sk = keyGen.generateKey();
      FileWriter fw = new FileWriter(keyFile);
      fw.write(byteArrayToHexString(sk.getEncoded()));
      fw.flush();
      fw.close();
    }
    
   SecretKeySpec sks = getSecretKeySpec(keyFile);
   Cipher cipher = Cipher.getInstance(CryptoUtils.AES);
   cipher.init(Cipher.ENCRYPT_MODE, sks, cipher.getParameters());
   byte[] encrypted = cipher.doFinal(value.getBytes());
   return byteArrayToHexString(encrypted);
  }
  
  /**
   * decrypt a value  
   * @throws GeneralSecurityException 
   * @throws IOException 
   */
  public static String decrypt(String message, File keyFile) 
  throws GeneralSecurityException, IOException 
  {
   SecretKeySpec sks = getSecretKeySpec(keyFile);
   Cipher cipher = Cipher.getInstance(CryptoUtils.AES);
   cipher.init(Cipher.DECRYPT_MODE, sks);
   byte[] decrypted = cipher.doFinal(hexStringToByteArray(message));
   return new String(decrypted);
  }
  
  
  
  private static SecretKeySpec getSecretKeySpec(File keyFile) 
  throws NoSuchAlgorithmException, IOException 
  {
    byte [] key = readKeyFile(keyFile);
    SecretKeySpec sks = new SecretKeySpec(key, CryptoUtils.AES);
    return sks;
  }

  private static byte [] readKeyFile(File keyFile) 
  throws FileNotFoundException 
  {
    Scanner scanner = 
      new Scanner(keyFile).useDelimiter("\Z");
    String keyValue = scanner.next();
    scanner.close();
    return hexStringToByteArray(keyValue);
  }

  
  private static String byteArrayToHexString(byte[] b){
    StringBuffer sb = new StringBuffer(b.length * 2);
    for (int i = 0; i < b.length; i++){
      int v = b[i] & 0xff;
      if (v < 16) {
        sb.append('0');
      }
      sb.append(Integer.toHexString(v));
    }
    return sb.toString().toUpperCase();
}

  private static byte[] hexStringToByteArray(String s) {
    byte[] b = new byte[s.length() / 2];
    for (int i = 0; i < b.length; i++){
      int index = i * 2;
      int v = Integer.parseInt(s.substring(index, index + 2), 16);
      b[i] = (byte)v;
    }
    return b;
}
  
  public static void main(String[] args) throws Exception {
    final String KEY_FILE = "pasta1/chave.temp";
    final String PWD_FILE = "pasta2/howto.properties";
    
    String clearPwd= "Minha Senha Secreta";
    
    Properties p1 = new Properties();
    
    p1.put("user", "Real");
    String encryptedPwd = CryptoUtils.encrypt(clearPwd, new File(KEY_FILE));
    p1.put("pwd", encryptedPwd);
    p1.store(new FileWriter(PWD_FILE), "");
    
    // ==================
    Properties p2 = new Properties();
    
    p2.load(new FileReader(PWD_FILE));
    encryptedPwd = p2.getProperty("pwd");
    System.out.println("Criptografada :" + encryptedPwd);
    System.out.println(CryptoUtils.decrypt(encryptedPwd, new File(KEY_FILE)));

    
  }
}

Alguem ja teve esse tipo de problema??? Poderiam me ajudar na solução???
Desde já agradeço

5 Respostas

Andre_Fonseca

oi,

você instalou o JCE ?

basicamente tem que alterar dois jars. local_policy.jar e US_export_policy.jar

abs

E

Voc~e gerou a chave como um array de 16 bytes e criou um arquivo de 32 bytes (porque converteu para hexadecimal). Aí quando foi ler a chave você leu os 32 caracteres em um array de bytes, para jogar diretamente como se fosse uma chave. Ele deu esse erro engraçado mas aindabem que deu esse erro :slight_smile:

F

Então Andre Fonseca eu não havia instalado o JCE, porem mesmo depois de ter instalado os dois jars o erro ainda continua acontecendo… como devo proceder para alterar os jars???

E

O erro mostrado (mas que não é a origem do seu problema) é que você está tentando carregar uma chave de 256 bits, o que não pode ser feito sem modificar o arquivo de policy na JVM.

Como eu havia dito, não é esse seu problema - não vá pelo caminho errado.

Note que você criou uma chave de 128 bits, codificou-a em hexadecimal, e na hora de carregá-la, deveria ter decodificado o hexadecimal para binário, para continuar a ter os 128 bits. Como você leu o hexadecimal como se fossem bytes, você duplicou o tamanho da chave, o que obviamente vai dar problemas.

Para corrigir isso, ao ler o arquivo da chave, você deve converter o hexadecimal para binário.

Outra forma, mais boboca, é guardar a chave diretamente como binário, o que acho melhor.

Andre_Fonseca

oi,

para alterar os jars é só copiar por cima mesmo, você alterou na pasta do JDK e também do JRE?

algo como

C:\Program Files\Java\jdk1.6.0_18\jre\lib\security e C:\Program Files\Java\jre6\lib\security

Caso isso esteja certo precisa verificar o tamanho da chave gerada conforme foi dito antes…

abs

Criado 7 de dezembro de 2012
Ultima resposta 10 de dez. de 2012
Respostas 5
Participantes 3