AES-Verschluesselung

gora

Mitglied
Hallo Javaprofies!

Ich arbeite zur Zeit an einem Program zum versenden von Dateien via Sockets.
Allerdings will ich diese Dateinen verschlüsseln, was ich mit einer Hybrid-Verschlüsselung realisiert habe.
D.h. ich verschlüssele die Datei sinkron mit einem 256Bit Aes-Key und
diesen Key wrappe ich anschließend mit einem 2048 Bit RSA-Pub-Key.
Dies erstmal zur Erläuterung.

Nun zu meinem eigentlichen Problem.
Der Aes-Key wird in Abhaengigkeit von einem Passwort generiert.
Und dort hakt mein Programm.
Wer diese Passwort hat, ist in der Lage das File zu entschlüsseln. :mad:
Wie gelingt es mir einen sicheren AES-Schluessel zu erzeugen, der nicht von einem Passwort abhaengig ist?

Und ab diesem Moment bitte ich euch um Hilfe. Ich möchte einen möglichst wiederstandsfähigen Aes-Key generieren.

Ich habe schon einem Menge Foren durchsucht und habe aber nie etwas wirklich zufriedenstellendes gefunde.

Jetzt schon einmal vielen Dank für eure Mühe!

Gruß Gora
 
Moin!
Ich frage mich gerade, wie du diesen AES Schlüssel erzeugst, genauer gesagt warum du denn ein Passwort benutzt, wenn es dir so unsicher erscheint?
Wenn ich mir die Spezifikation nämlich so ansehe, benötigst du zur Erstellung eines AES Secret Keys nur ein Byte Array.. Erstell dir doch einfach ein zufälliges Byte Array?! (Random.nextBytes())

*grüssle*
MeinerEiner
 
Hallo,

da du hybrid-verschlüsselung benutzt, brauchst du eigentlich gar kein passwort, sondern könntest den AES-Schlüssel von Java generieren lassen.

Java:
KeyGenerator keygen=KeyGenerator.getInstance("AES");

keygen.init(256);
Key key = keygen.generateKey()

MFG

zEriX
 
Vielen Dank erstmal für eure Hilfe.

Im Moment sieht die Funktion die benutze so aus:

Code:
 public void AES_Key(String password) throws Exception  {

        BASE64Decoder b64 = new BASE64Decoder();
        byte [] cipherText = b64.decodeBuffer(password);
        MessageDigest messagedigest = MessageDigest.getInstance("MD5");
        messagedigest.reset();
        messagedigest.update(cipherText);
        Arrays.fill(cipherText, (byte)0);

       this.key = new SecretKeySpec(messagedigest.digest(), "AES");
    }

(sorry für diesen miesen CodeStyle ... ich bin gerade in der Phase des Dirty-coding ^^)

Aber nochmals Danke

Ich werde mich da morgen nochmal dransetzen und das Ganze ausprobieren.

In diesem sinne Euch noch einen schoenen Abend.

Macht's gUUt.
Bis Morgen

Gruß Gora
 
Wenn du einen 100% sicheren Schlüssel generieren möchtest, dann bleibt dir nur der Umweg über eine physikalische Größe, wie etwa radioaktiver Zerfall oder atmosphärisches Rauschen. Damit erstellt du dir ein wirkliches zufälliges Bitarray auf dessen Grundlage du dir deinen Schlüssel erstellen kannst. Zwar liefern auch alle Programme Zufallszahlen, die sind aber deterministisch - also Pseudozufallszahlen die unter gleichen Startbedingungen immer wieder erzeugt werden.
 
Hallo,

ich setze bedingt durch Vorgaben im Team das jdk1.5.0_07 ein.
Java:
KeyGenerator keygen=KeyGenerator.getInstance("AES");
keygen.init(256);
Key key = keygen.generateKey()
wenn ich dieses Beispiel ausbaue zu
Java:
String data = "This is a test 4 crypting and decrypting. Please contact administrator for help if any error happens.";       
try
{
    KeyGenerator keygen = KeyGenerator.getInstance("AES");               
    keygen.init(256);//,random);
    Key secretKey = keygen.generateKey();            
      
    Cipher cipher = Cipher.getInstance("AES");
        byte[] encrypted = data.getBytes("UTF8");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encryptBytes = cipher.doFinal(encrypted);
    String encryptString = new String(encryptBytes);

    cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] decryptBytes = cipher.doFinal(encryptBytes);
    String decryptString = new String(decryptBytes);
   
    System.out.println("Encrypt  String : (" + encryptString + ")");   
    System.out.println("Original String : (" + data + ")");
    System.out.println("Decrypt  String : (" + decryptString + ")");   
}
    catch(Exception e)
{
    e.printStackTrace();
}
ist das Ergebnis eine Exception Illegal key size or default parameters in der Zeile cipher.init(Cipher.ENCRYPT_MODE, secretKey). :mad:

Der Witz ist - mit keygen.init(128) klappt alles wunderbar. :confused:

Was kann ich bitte tun. Ich bin mit meinem Anfängerwissen am Ende und brauche DRINGENST Hilfe!

Gruß und Dank
Kai
 
Hallo,
danke für die Info, aber das problem scheint woanders zu liegen. ein tipp aus einem anderen Forum war: Ma muss Full Encryption Support einschalten. (Policy Files)
http://java.sun.com/javase/technologies/security/

Alledings habe ich nun noch folgendes Problem: Wenn ich die Zeile
byte[] decryptBytes = cipher.doFinal(encryptBytes);
in
byte[] decryptBytes = cipher.doFinal(encryptString.getBytes());
ändere, d.h. nicht mehr die encrypteten Bytes verwende, sondern über einen String gehe, was ich muss, da eine DB dazwischen ist, bekomme ich leider folgendes Ergebnis:

Encrypt String : (à÷PMÃBH©ý wâá’‰âMŸ×ÞleSÐÖ‡+èÊ0ði„<¦ÐIÆæ»[ÑZß1‡ª4JPÄJ?Ñ®©‘¿‡µ<P V¾×|&wzÁm€A^Ö¤é—1eÿðPų¡5ÓdÔ(쀴ëÑú}ȇ)
Original String : (This is a test 4 crypting and decrypting. Please contact administrator for help if any error happens.)
Decrypt String : (This is a test 4•¾À
Ó”aVT¢²¸Äcrypting. Please¡?<²S%ÖKZ‡º÷vtrator for help if any error happens.)


Also ist hier bei mir noch was falsch. Habt Du da eine Idee?

Gruß Kai
 
Zuletzt bearbeitet von einem Moderator:
Zurück