Java für Fortgeschrittene Proseminar im Sommersemester 2009 Java und Kryptographie Install Guide für die Bouncy-Castle API Markus Dauberschmidt, [email protected] Technische Universität München 26.06.2009 1 Download von Bouncy Castle Die Bouncy-Castle API kann im Internet von http://www.bouncycastle.org/latest_releases.html heruntergeladen werden. Wie für Java-Erweiterungen üblich erfolgt die Bereitstellung in Form eines JARArchives. Dieses JAR Archiv (bcprov-ext-jdk16-141.jar) muss in das lib\ext Verzeichnis der JRE Installation kopiert werden, z.B. C:\Program Files\Java\jdk1.6.0_07\jre\lib\ext unter Windows. (Achtung: Die Extension muss in das Verzeichnis im jre Unterverzeichnis kopiert werden, nicht in das lib\ext im JDK Hauptverzeichnis!) Nach dem die Datei in das Extension-Verzeichnis kopiert wurde, muss sie für das JDK noch aktivert werden. Hierzu muss die Datei java.security im gleichen Verzeichis bearbeitet werden. In dieser Datei sind u.a. sämtliche Provider aufgeführt. Die entsprechenden Zeilen beginnen mit security.provider.N=. An diese Liste muss die BC API manuell hinten wie aus der Abbildung ersichtlich angefügt werden und mit einer laufenden Nummer versehen werden. Achtung: Der BC Provider sollte immer als letzter Eintrag in die Liste eingefügt werden. 1 2 Aktivieren der unlimited strength Policy Ende der 90er Jahre war es noch nicht ohne weiteres möglich starke Kryptographie für die breiten Massen zur Verfügung zu stellen. Die US-amerikanische Regierung wollte sicherstellen, dass verschlüsselte Kommunikation nur solange verschlüsselt blieb, solange sie nicht Staatsinteressen gefährdete und verbot kurzerhand alle Schlüssellängen >40 Bit. 40 bit lange Schlüssel waren allerdings für versierte Angreifer keine unüberwindliche Hürde. Mit der Rechenkraft heutiger Heimcomputer kann allerdings jedermann 40 bit lange Schlüssel in Kürze knacken, so dass diese auch für nicht so wichtige Daten nicht mehr verwendet werden sollten. Der Standard ist heute eine Verschlüsselung mit 128 Bit. Da es aber nach wie vor Länder gibt, die den Einsatz starker Kryptographie nicht gestatten bzw. andererseits Kryptographie unter das Waen-Exportgesetz fällt, ist es nicht möglich ein JDK auszuliefern, welches von vornherein diese langen Schlüssellängen unterstützt. In dem Originalauslieferungszustand des SDKs bzw. JREs sind daher die maximal möglichen Schlüssellängen sowie die nutzbaren Algorithmen eingeschränkt. Welche Schlüssellängen mit einem JDK möglich sind, wird über eine sogenannte Policy-Datei festgelegt. Um starke Kryptographie einzusetzen, bietet Sun den Download einer weiteren Policydatei an, die keinerlei Einschränkungen mehr enthält, allerdings muss sich der Anwender diese explizit besorgen. Wird diese Policy-Datei java.security in die Verzeischnisstruktur lib/security des JRE eingespielt, so ist ohne weitere Änderungen der Einsatz groÿer Schlüssellängen sofort möglich. Wird in einer Applikation versucht, starke Kryptographie ohne Vorhandensein der unlimited policy Datei zu verwenden, so ist die Folge ein Laufzeitfehler/Exception. Die Policy-Datei (ozielle Bezeichnung Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy) kann von der Sun Webseite bezogen werden. Der Download bendet sich ganz unten auf der Downloadseite des J2SDK: http://java.sun.com/javase/downloads/?intcmp=1281 Abbildung 1: Der Downloadlink zum unlimited strength Policy le 2 3 Test der Installation Um die Installation der Bouncy Castle API und der unlimited strength Policy zu testen, kann folgendes kleines Java-Programm verwendet werden: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import j a v a x . c r y p t o . ∗ ; import j a v a x . c r y p t o . s p e c . ∗ ; public c l a s s SimplePolicyTest { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) throws E x c e p t i o n { byte [ ] data = " H e l l o World ! " . g e t B y t e s ( ) ; // c r e a t e a 64 b i t s e c r e t key from raw b y t e s SecretKey key64 = new SecretKeySpec ( new byte [ ] { 0 x00 , 0 x01 , 0 x02 , 0 x03 , 0 x04 , 0 x05 , 0 x06 , 0 x07 } , " Blowfish ") ; // c r e a t e a c i p h e r and attempt t o e n c r y p t t h e data b l o c k with our key Cipher c = Cipher . g e t I n s t a n c e ( " B l o w f i s h /ECB/PKCS7Padding " , "BC" ) ; c . i n i t ( Cipher .ENCRYPT_MODE, key64 ) ; byte [ ] out = c . d o F i n a l ( data ) ; out = new byte [ ] { 0 x00 } ; System . out . p r i n t l n ( " 6 4 b i t t e s t : p a s s e d " ) ; // c r e a t e a 192 b i t s e c r e t key from raw b y t e s SecretKey key192 = new SecretKeySpec ( new byte [ ] { 0 x00 , 0 x01 , 0 x02 , 0 x03 , 0 x04 , 0 x05 , 0 x06 , 0 x07 , 0 x08 , 0 x09 , 0 x0A , 0 x0B , 0 x0C , 0 x0D , 0 x0E , 0 x0F , 0 x10 , 0 x11 , 0 x12 , 0 x13 , 0 x14 , 0 x15 , 0 x16 , 0 x17 } , " Blowfish ") ; // now t r y e n c r y p t i n g with t h e l a r g e r key c . i n i t ( Cipher .ENCRYPT_MODE, key192 ) ; out = c . d o F i n a l ( data ) ; c . i n i t ( Cipher .DECRYPT_MODE, key192 ) ; out = c . d o F i n a l ( out ) ; } } System . out . p r i n t l n ( " 1 9 2 b i t t e s t : p a s s e d " ) ; System . out . p r i n t l n ( " T e s t s completed " ) ; Listing 1: Bouncy Castle Testprogramm Ist das JDK korrekt konguriert, wird die folgende Meldung ausgegeben: 64 bit test: passed 192 bit test: passed Tests completed Ist etwas nicht in Ordnung, kommt es zu einer Exception. In diesem Fall sollte die Installation erneut überprüft werden. 3