# Java Verschlüsselung/Cipher



## Auron (3. Aug 2008)

Hallo alle zusammen,

ich habe da mal eine Frage. Ich möchte gern Dateien die ich mit einem Java-Porgramm schreibe verschlüsseln, habe aber leider noch nicht ganz begriffen wie der Cipher funktioniert.
Zum Beispiel, wenn ich ein serialized Objekt speichere und da sind Strings und Zahlen drin sind diese auch so in der Datei lesbar, was sie aber nicht sein sollen. Wie könnte ich das zum Beispiel verschlüsseln. Schon mal danke für alle Antworten.

Auron


----------



## SlaterB (3. Aug 2008)

http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html


----------



## Auron (3. Aug 2008)

das gehört doch nicht zur Java api, geht das nciht auch mit den Standardbibliotheken? Java hat doch schon eine Klasse Cipher.


----------



## Guest (3. Aug 2008)

Siehe: http://www.java2s.com/Code/Java/Security/Encryption.htm


----------



## Auron (3. Aug 2008)

Kann mir einer sagen wofür dieser Provider gut ist? Wozu brauch man den bei der Verschlüsselung?


----------



## Guest (4. Aug 2008)

Hier noch ein einfaches Beispiel
	
	
	
	





```
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class DESExample {
   private static Cipher getCipher(final int opmode, final byte key[]) throws GeneralSecurityException {
      assert opmode == Cipher.ENCRYPT_MODE || opmode == Cipher.DECRYPT_MODE;
      assert key != null;
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
      cipher.init(
         opmode,
         SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(key)),
         new IvParameterSpec(new byte[] { 0x10, 0x10, 0x01, 0x04, 0x01, 0x01, 0x01, 0x02 } )
      );
      return cipher;
   }

   public static void main(String args[]) {
      try {
         byte key[] = "sowasvongeheim".getBytes();
         Cipher enc = getCipher(Cipher.ENCRYPT_MODE, key);
         Cipher dec = getCipher(Cipher.DECRYPT_MODE, key);

         byte encryptedText[] = enc.doFinal("Dies ist streng geheim".getBytes());
         byte decryptedText[] = dec.doFinal(encryptedText);

         System.out.println(new String(encryptedText));
         System.out.println(new String(decryptedText));
      }
      catch(GeneralSecurityException e) {
         e.printStackTrace();
      }
   }
}
```


----------



## Auron (4. Aug 2008)

Cool, danke. Jetzt weiß ich zumindest geht auch ohne Provider.  :wink:


----------



## Loep (6. Aug 2008)

Hi,
danke, klasse, hatte vor einiger Zeit auch schonmal Probleme mit dem Cipher.

Aber nun steh ich vor einem weiteren:
Wieso kann ich das verschlüsselte nicht in eine Property schreiben, dann auslesen und wieder entschlüsseln?


```
public class DESCipher {
	public static Cipher getCipher(final int opmode, final byte key[]) throws GeneralSecurityException {
		assert opmode == Cipher.ENCRYPT_MODE || opmode == Cipher.DECRYPT_MODE;
		assert key != null;
		Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		cipher.init(opmode, SecretKeyFactory.getInstance("DES").generateSecret(
				new DESKeySpec(key)), new IvParameterSpec(new byte[] { 0x10,
				0x10, 0x01, 0x04, 0x01, 0x01, 0x01, 0x02 }));
		return cipher;
	}

	public static void main(String args[]) {
		try {
			Properties props = new Properties();
			byte key[] = "sowasvongeheim".getBytes();

			Cipher enc = getCipher(Cipher.ENCRYPT_MODE, key);
			byte encryptedText[] = enc.doFinal("kodak".getBytes());
			props.setProperty("passwd", new String(encryptedText));
			System.out.println(new String(encryptedText));

			Cipher dec = getCipher(Cipher.DECRYPT_MODE, key);
			encryptedText = props.getProperty("passwd").getBytes();
			byte decryptedText[] = dec.doFinal(encryptedText);
			System.out.println(new String(decryptedText));
		} catch (GeneralSecurityException e) {
			e.printStackTrace();
		}
	}
}
```

"kodak" geht nicht als Verschlüsselungsinhalt
^- javax.crypto.BadPaddingException: Given final block not properly padded
"blub" hingegen geht.

Wieso? Wo liegt das Problem?


----------



## Guest (6. Aug 2008)

```
byte key[] = "sowasvongeheim".getBytes();
Cipher enc = getCipher(Cipher.ENCRYPT_MODE, key);

byte vorher[] = enc.doFinal("kodak".getBytes());
byte nachher[] = new String(vorher).getBytes(); // Hier ist das Problem

System.out.println(Arrays.equals(vorher, nachher));
System.out.println(Arrays.toString(vorher));
System.out.println(Arrays.toString(nachher));
```
Merkst du was?


----------



## Guest (6. Aug 2008)

Verwende die put/get Methoden.
	
	
	
	





```
Properties props = new Properties();
byte key[] = "sowasvongeheim".getBytes();

Cipher enc = getCipher(Cipher.ENCRYPT_MODE, key);
byte encryptedText[] = enc.doFinal("kodak".getBytes());
props.put("passwd", encryptedText);

Cipher dec = getCipher(Cipher.DECRYPT_MODE, key);
encryptedText = (byte[])props.get("passwd");
byte decryptedText[] = dec.doFinal(encryptedText);
System.out.println(new String(decryptedText));
```


----------



## Loep (6. Aug 2008)

Mh, ok... also wird da was konvertiert von byte[] zu String.
Aber das bringt mich noch nicht auf die Lösung des Problems.
Gibts ne Option um das zu unterbinden oder geht der Weg so gar nicht?

Hab hier im Forum bisher nur einen entsprechenden Beitrag gefunden, der jetzt nicht mehr den String verschlüsselt, sondern nachträglich die gesamte Property-Datei. Das würd ich ungern


----------



## Loep (7. Aug 2008)

Scheint als hätte ich eine Lösung:


```
Properties props = new Properties();
byte key[] = "sowasvongeheim".getBytes();

Cipher enc = getCipher(Cipher.ENCRYPT_MODE, key);
byte encryptedBytes[] = enc.doFinal("kodak".getBytes());
String encryptedString = new sun.misc.BASE64Encoder().encode(encryptedBytes);
props.setProperty("passwd", new String(encryptedString));
System.out.println("Encrypted: " + encryptedString);

Cipher dec = getCipher(Cipher.DECRYPT_MODE, key);
encryptedBytes = props.getProperty("passwd").getBytes();
byte[] b64array = new sun.misc.BASE64Decoder().decodeBuffer(new String(encryptedBytes));
byte decryptedText[] = dec.doFinal(b64array);
System.out.println("Decrypted: " + new String(decryptedText));
```

Hab dazu was im SDN Forum gefunden, trotzdem danke!


----------



## HoaX (7. Aug 2008)

schau dir mal jasypt.org an. damit geht das ganz easy ohne viel Zutun


----------

