Java AES: Kein installierter Anbieter unterstützt diesen Schlüssel: javax.crypto.spec.secretkeysspec

StackOverflow https://stackoverflow.com/questions/8362262

Frage

Ich versuche, 128 -Bit -AES -Verschlüsselung einzurichten, und ich bekomme eine Ausnahme auf meine Chiffre.

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

Ich generiere den Schlüssel auf der Clientseite mit dem folgenden Code:

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

Dieser Schlüssel wird dann als Header an den Server übergeben. Es wird Basis64 mit dieser Funktion codiert:

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

Der Server zieht den Header und tut es

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

Um dies zu debuggen, habe ich Breakpoints sowohl nach der Schlüsselgenerierung auf der Client -Seite als auch kurz vor der Verschlüsselung auf der Serverseite eingestellt. Laut Netbeans sind die Bytes, aus denen die SecretKeys besteht, identisch und sind 16 Bytes lang (soweit ich das beurteilen kann, sind die Objekte identisch).

Ich bin mir der unbegrenzten Kraft -JCE -Sachen bewusst, aber ich bin nicht in dem Eindruck, dass ich es für 128 Bit AES brauchte.

Client -Seite: Java -Version "1.6.0_26"

Serverseite: Java -Version "1.6.0_20"

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich habe Ihren Code auf unterschiedliche Weise ausgeführt, mit: Java 1. {5,6,7} (mit AES); Verschiedene Base64 -Codecs (Apache Commons codec, DataTypeconverted, Base64); verschiedene Zeichensätze; zwischen verschiedenen JVMs (durch Sockets)… ohne Erfolg. Ich habe keine Fehler.

Kannst du den folgenden Code auf dem Problem eingrenzen, um das Problem einzugrenzen, um den folgenden Code auszuführen? beide endet?

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

(Ich weiß, dass Sie bereits die JDK -Versionen angegeben haben, die Sie verwenden, und so, aber es kann nicht schaden.)

Angesichts der Tatsache, dass der Schlüssel nicht beschädigt wird, während Sie ihn vom Client auf Server übertragen (oder möglicherweise in umgekehrt), dann, wenn:

  • Der Client wirft, aber der Server nicht - der Fehler ist auf der Clientseite;
  • Der Client wirft nicht, aber der Server tut - der Fehler ist auf der Serverseite;
  • Der Client und der Server sind sowohl Auswürfe als auch keiner von beiden - nervt weitere Untersuchungen.

Wenn ein Fehler geworfen wird, posten Sie bitte die ganz Stapelspur irgendwo. Der Fehler No installed provider supports this key: javax.crypto.spec.SecretKeySpec sagt uns nichts (zumindest für mich nicht, und ich konnte diesen speziellen Fehler auch nicht reproduzieren).

Andere Tipps

Dieser Fehler könnte darauf hinweisen, dass Sie JCE (Java Cryptography Extension) installieren müssen.

Laden Sie diese Datei (oder neuere Version) herunter und kopieren Sie JARs in JDK_FOLDER/JRE/lib/Securityhttp://www.oracle.com/technetwork/pt/java/javase/downloads/jce-6-Download-429243.html

Dieser Fehler tritt bei mir auf, wenn es einen falschen Schlüssel zur Verfügung stellt SecretKeySpec Konstrukteur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top