Java für Fortgeschrittene Proseminar im Sommersemester

Transcrição

Java für Fortgeschrittene Proseminar im Sommersemester
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