# AES-Verschlüsselung mit eigenem 256 Bit Schlüssel



## thomas235 (7. Aug 2012)

Hallo zusammen,

ich zerbreche mir schon seit einiger Zeit den Kopf darüber, wie ich einen String mit AES verschlüsseln kann und dabei selbst den Schlüssel festlegen kann (den Schlüssel bekomme ich über DiffieHellman).

Auch google und sonstige Suchfunktionen haben mir keine brauchbaren Ergebnisse geliefert.

Diese Seite:
AES 256 bits encrypter/decrypter - Java source code - DevKB.org
hat einen unter Linux funktionierenden Ansatz geliefert, der unter Windows seltsamerweise überhaupt nicht funktioniert.

Weiß von euch vllt jemand, wie man sogar mit einer Java Library einen 256 Bit Schlüssel realisiert?

gruß thomas235


----------



## ThreadPool (7. Aug 2012)

thomas235 hat gesagt.:


> [...]Weiß von euch vllt jemand, wie man sogar mit einer Java Library einen 256 Bit Schlüssel realisiert?



Für 256 Bit Schlüssel benötigst du eine spezielle "Policy". Siehe Java Cryptography Architecture Oracle Providers Documentation und hier Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download.


----------



## J7Dev (7. Aug 2012)

Richtig, für Rjindeal-256 brauchst du entweder eine freie Lib wie BouncyCastle oder die "unlimited crypto-policy" was dann aber vorraussetzung für ALLE VMs ist auf denen der Code laufen soll -> extrem schlechte Idee.

Und die Bezeichnung "AES-256" ist sowieso falsch da AES auf eine Schlüssellänge von 128 festgelegt ist. Nur der zugrunde liegende Rjindeal-Algo kann mit Keys von 192 und 256 bit verwendet werden. Da dieser von Java aber so nicht richtig implementiert ist sondern eine art pseudo-AES-256 darstellt ist die Funktionsweise nicht gesichert. Wenn es unbedingt Rjindeal-256 sein muss würde ich wirklich zu BouncyCastle raten, mit Java eigenen Mitteln ist es eher ein Krampf da die policy in jeder VM installiert werden müsste auf der es laufen soll, BC hingegen kannst du einfach als Bundle mitliefern.


----------



## thomas235 (7. Aug 2012)

schonmal danke für die Antwort.
muss ich um diese Policies verwenden zu können zusätzliche Dateien installieren, bzw müssen das alle Anwender auch tun?
dann wäre das eher keine Option für mich


----------



## J7Dev (7. Aug 2012)

Dann wird die policy für dich wohl eher keine Option da dies wie gesagt von allen gemacht werden müsste. BC ist hier wohl dann doch eher die richtige Wahl.


----------



## HoaX (7. Aug 2012)

> Und die Bezeichnung "AES-256" ist sowieso falsch da AES auf eine Schlüssellänge von 128 festgelegt ist.


 Die Blockgröße ist auf 128 festgelegt, nicht die Schlüssellänge!


----------



## thomas235 (7. Aug 2012)

kennt jemand vllt ein gutes Tutorial, wie BouncyCastle zu verwenden ist?

am besten in der Art:

"Schlüssel zuweisen;
Nachricht verschlüsseln;
Nachricht entschlüsseln"

gruß thomas235


----------



## Lumaraf (7. Aug 2012)

Es müßte eigentlich ausreichen [c]Security.addProvider(new BouncyCastleProvider());[/c] aufzurufen. Dann registriert sich BC für die schon vorhanden crypto-Schnittstellen in Java.


----------



## HoaX (7. Aug 2012)

Jup, der Rest läuft dann ganz normal über die Crypto-API.


----------



## thomas235 (7. Aug 2012)

danke  schonmal  ich denke das mit den 256 Bit hat geklappt, aber was mir noch fehlt ist, wie ich meinen eigenen Schlüssel da reingrieg und keinen generieren lasse.
Bisher sieht das so aus:

```
Security.addProvider(new BouncyCastleProvider());

        // Get the KeyGenerator

        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(256); // 192 and 256 bits may not be available


        // Generate the secret key specs.
        skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();

        skeySpec = new SecretKeySpec(raw, "AES");


        // Instantiate the cipher

        cipher = Cipher.getInstance("AES");
```

also meine Idee wäre meinen Schlüssel (den Client und Server schon kennen) in die Variable "raw" einzutragen
bringt das den gewünschten Effekt?

gruß thomas235


----------



## HoaX (7. Aug 2012)

```
byte[] raw = ...
```
 ist dein Key. Du musst ja keinen KeyGenerator nutzen wenn du nicht magst.

Edith sagt: übersehen dass du unter dem Code noch weitergeschrieben hattest, also: ja, raw ist das wofür du es hältst.


----------



## thomas235 (7. Aug 2012)

alles klar, danke euch

ich werd das demnächst alles in mein Programm einbauen

ach ja, brauch ich die BouncyCastle Lib überhaupt, wenn ich den Key mit 256 Bits (also ein Byte Array mit 32 Bytes) direkt in raw eintrage? wenn ich die Zeile mit dem Provider weglasse erhalte ich trotzdem das gleiche Ergebnis.


----------



## thomas235 (8. Aug 2012)

Guten Morgen zusammen,

habe jetzt alles in mein Programm eingebaut, den Provider BouncyCastle hab ich auch noch drin, unter Linux läuft mit und ohne Provider alles einwandfrei, aber unter Windows kommt natürlich die Illegal KeySize Excetion und dass der Provider die Schlüssellänge nicht unterstützt.
Unter Linux läuft die JDK1.6, unter Windows nur die JRE 7 weiß jemand, wie ich das in den Griff griege?

gruß thomas235


----------

