Die Java Cryptography Extension (JCE) ist eine Schnittstelle der Programmiersprache Java und Framework für kryptographische Aufgaben wie Verschlüsselung, Kommunikations-Authentifizierung und Schlüsselverwaltung. Seit dem JDK 1.4 ist sie Teil der Java Platform, Standard Edition, davor war sie (ab JDK 1.2) als optionales Paket erhältlich.
Die Java Cryptography Extension beruht auf derselben Architektur wie die Java Cryptography Architecture (JCA) und wird als Teil der JCA gesehen. Die Aufteilung in JCA und JCE war nötig, weil die USA früher den Export kryptographischer Systeme beschränkten. Die JCA enthält nur Hashfunktionen, Schlüsselgeneratoren usw. und durfte frei exportiert werden. Für starke Verschlüsselungsalgorithmen galt dies nicht; deshalb lagerte man sie in die JCE aus. Implementierungen mussten von anderer Stelle bezogen werden.
Wie die Klassen der JCA liegen die der JCE heute in den Packages java.security
und javax.crypto
.
Die Java Cryptography Extension basiert auf sogenannten Kryptographie-Providern, das sind Implementierungen von verschiedenen, durch die JCE abstrahierten kryptographischen Konzepten. Neue Konzepte können leicht hinzugefügt werden.
Die Java Cryptography Extension bietet folgende Funktionalitäten:
KeyGenerator
für die Schlüsselgenerierung, KeyAgreement
zum sicheren Aushandeln von Schlüsseln sowie SecretKeyFactory
zur Zerlegung von Schlüsseln in ihre AnteileDie Java Cryptography Extension ist, wie auch die Java Cryptography Architecture, von der Implementierung der konkreten Algorithmen unabhängig. Über ein Service Provider Interface (SPI) können unterschiedliche Implementierungen von unterschiedlichen Herstellern gleichzeitig in die Java-Laufzeitumgebung eingebunden werden. Java wird ab Version 1.4 mit einer JCE und JCA Implementierung ausgeliefert, andere Implementierungen können aber einfach sowohl statisch als auch dynamisch nachgeladen werden.
Zu den bekanntesten JCE-Implementierungen gehören:
Das folgende Beispiel zeigt die Verschlüsselung und Entschlüsselung eines Strings mittels AES-CBC mit Padding nach PKCS #7:
// Schlüssel erzeugen
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// Verfahren wählen
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// Umwandlung des Strings nach Bytes basierend auf UTF-8
byte[] utf8Bytes = "Zu verschlüsselnder String".getBytes("UTF8");
// Verschlüsselung
byte[] encryptedBytes = cipher.doFinal(utf8Bytes);
// Base64 encoding um wieder einen String zu bekommen
String encryptedString = java.util.Base64.getEncoder().encodeToString(encryptedBytes);
// Cipher für Entschlüsselung vorbereiten
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// Rückumwandlung in Byte-Array
encryptedBytes = java.util.Base64.getDecoder().decode(encryptedString);
// Entschlüsselung
utf8Bytes = cipher.doFinal(encryptedBytes);
// Rückumwandlung in einen String
return new String(utf8Bytes, "UTF8");