Domanda

Sto provando a impostare la crittografia AES a 128 bit e viene generata un'eccezione sul mio Cipher.init:

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

Sto generando la chiave sul lato client utilizzando il seguente codice:

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();

Questa chiave viene quindi passata al server come intestazione.è codificato Base64 utilizzando questa funzione:

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

Il server estrae l'intestazione e lo fa

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;
}

Per eseguire il debug, ho inserito dei punti di interruzione sia dopo la generazione della chiave sul lato client, sia subito prima di cipher.init sul lato server.Secondo Netbeans, i byte che compongono le SecretKeys sono identici e sono lunghi 16 byte (in effetti, per quanto ne so, gli oggetti sono identici).

Sono a conoscenza della forza illimitata del materiale JCE, ma non ho l'impressione di averne bisogno per AES a 128 bit.

Dalla parte del cliente:versione Java "1.6.0_26"

Lato server:versione Java "1.6.0_20"

Qualche idea?

È stato utile?

Soluzione

Ho eseguito il tuo codice in diversi modi, con:Java 1.{5,6,7} (utilizzando AES);diversi codec Base64 (Apache Commons Codec, DatatypeConverted, Base64);set di caratteri diversi;tra diverse JVM (tramite socket)... senza alcun risultato.Non ho riscontrato errori.

Per restringere il problema, puoi eseguire il seguente codice su Entrambi finisce?

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);
}

(So ​​che hai già indicato le versioni JDK che stai utilizzando e cose del genere, ma non può far male.)

Dato che la chiave non viene danneggiata durante il trasferimento dal client al server (o forse al contrario), se:

  • il client lancia un'eccezione, ma il server no: l'errore è sul lato client;
  • il client non lancia un'eccezione, ma il server sì: l'errore è sul lato server;
  • il client e il server lanciano entrambi un'eccezione oppure nessuno dei due: sono necessarie ulteriori indagini.

In ogni caso, se viene generato un errore, postare il file Totale traccia dello stack da qualche parte.L'errore No installed provider supports this key: javax.crypto.spec.SecretKeySpec non ci dice nulla (almeno per me non è così, e non sono riuscito a riprodurre neanche questo particolare errore).

Altri suggerimenti

Questo errore potrebbe indicare che è necessario installare JCE (estensione di crittografia Java).

Scarica questo file (o versione più recente) e copia i barattoli su JDK_Folder/JRE/lib/sicurezzahttp://www.oracle.com/technetwork/pt/java/javase/downloads/jce-6-download-429243.html

Questo errore avviene con me, quando fornisce una chiave errata a SecretKeySpec costruttore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top