ti-enxame.com

Java AES: Nenhum provedor instalado suporta esta chave: javax.crypto.spec.secretkeyspec

Estou tentando configurar a criptografia AES de 128 bits, e estou recebendo uma exceção lançada no meu cifol.

No installed provider supports this key: javax.crypto.spec.SecretKeySpec

Estou gerando a chave no lado do cliente usando o seguinte código:

private KeyGenerator kgen;
try {
        kgen = KeyGenerator.getInstance("AES");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    kgen.init(128);
}
SecretKey skey = kgen.generateKey();

Esta chave é então passada para o servidor como cabeçalho. É base64 codificado usando esta função:

public String secretKeyToString(SecretKey s) {
        Base64 b64 = new Base64();
        byte[] bytes = b64.encodeBase64(s.getEncoded());
        return new String(bytes);
}

O servidor puxa o cabeçalho e faz

protected static byte[] encrypt(byte[] data, String base64encodedKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("AES");
    } catch (NoSuchAlgorithmException ex) {
        //log error
    } catch (NoSuchPaddingException ex) {
        //log error
    }
    SecretKey key = b64EncodedStringToSecretKey(base64encodedKey);
    cipher.init(Cipher.ENCRYPT_MODE, key); //THIS IS WHERE IT FAILS
    data = cipher.doFinal(data);
    return data;
}
private static SecretKey b64EncodedStringToSecretKey(String base64encodedKey) {
    SecretKey key = null;

    try {
        byte[] temp = Base64.decodeBase64(base64encodedKey.getBytes());
        key = new SecretKeySpec(temp, SYMMETRIC_ALGORITHM);
    } catch (Exception e) {
        // Do nothing
    }

    return key;
}

Para depurar isso, coloco pontos de interrupção após a geração de chaves no lado do cliente e pouco antes do cifra.Init no lado do servidor. De acordo com o NetBeans, os bytes que compõem os secretkeys são idênticos e são 16 bytes de comprimento (de fato, tanto quanto eu posso dizer, os objetos são idênticos).

Estou ciente da força ilimitada JCE Coisas, mas não estou sob a impressão de que eu precisava para 128 bits.

Lado do cliente: Java versão "1.6.0_26"

Lado do servidor: Java versão "1.6.0_20"

Alguma ideia?

12
Cody S

Eu executar o código de maneiras diferentes, com: Java 1. {5,6,7} (usando AES); diferentes codecs Base64 (Apache Commons Codec, DatatypeConverted, Base64); diferente conjuntos de caracteres;. entre diferentes JVMs (através de sockets) ... sem sucesso I não tem erros.

Para reduzir o problema, você pode executar o seguinte código em ambos extremidades?

static {
  System.out.println(System.getProperty("Java.version"));
  for (Provider provider : Security.getProviders())
    System.out.println(provider);
}

public static void main(String[] args) throws Exception {
  KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  keyGenerator.init(128);
  SecretKey secretKey = keyGenerator.generateKey();
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.ENCRYPT_MODE, secretKey);
}

(Eu sei que você já declarou as versões do JDK que você está usando e outras coisas, mas não pode machucar.)

Dado que a chave não ficar corrompido quando você transferi-lo do cliente para o servidor (ou talvez em sentido inverso), em seguida, se:

  • o cliente lança, mas a Indiferente-o servidor de erro é no lado do cliente;
  • o cliente não jogar, mas o servidor faz-o erro está no lado do servidor;
  • o cliente eo servidor ambos joga ou nenhum deles com necessidades mais investigações.

Em qualquer caso, se um erro é lançado, por favor postar o inteira algum lugar rastreamento de pilha. O erro No installed provider supports this key: javax.crypto.spec.SecretKeySpec Nos diz nada (pelo menos para mim isso não acontecer, e eu não poderia reproduzir este erro em particular qualquer um).

7
Kohányi Róbert

Este erro pode indicar que você precisa instalar o JCE (extensão de criptografia Java).

Faça o download deste arquivo (ou versão mais recente) e copiar frascos para jdk_folder/jre/lib/security http://www.oracle.com/technetwork/pt/java/javase/downloads/jce-6-download-429243 .html .

6
Renato Figueiredo