# Verschlüsselung und Entschlüsselung von Texten



## guestN (10. Mrz 2011)

Hallo Miteinander,

ich benötige dringend Hilfe beim Verschlüsseln und Entschlüsseln von Texten.
Auf JCE Encryption – Data Encryption Standard (DES) Tutorial  habe ich ein Beispielprogramm gefunden, das einen Text mittels DES verschlüsselt und entschlüsselt:


```
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
 
public class JEncrytion
{    
	public static void main(String[] argv) {
 
		try{
 
		    KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
		    SecretKey myDesKey = keygenerator.generateKey();
 
		    Cipher desCipher;
 
		    // Create the cipher 
		    desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
 
		    // Initialize the cipher for encryption
		    desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
 
		    //sensitive information
		    byte[] text = "No body can see me".getBytes();
 
		    System.out.println("Text [Byte Format] : " + text);
		    System.out.println("Text : " + new String(text));
 
		    // Encrypt the text
		    byte[] textEncrypted = desCipher.doFinal(text);
 
		    System.out.println("Text Encryted : " + textEncrypted);
 
		    // Initialize the same cipher for decryption
		    desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
 
		    // Decrypt the text
		    byte[] textDecrypted = desCipher.doFinal(textEncrypted);
 
		    System.out.println("Text Decryted : " + new String(textDecrypted));
 
		}catch(NoSuchAlgorithmException e){
			e.printStackTrace();
		}catch(NoSuchPaddingException e){
			e.printStackTrace();
		}catch(InvalidKeyException e){
			e.printStackTrace();
		}catch(IllegalBlockSizeException e){
			e.printStackTrace();
		}catch(BadPaddingException e){
			e.printStackTrace();
		} 
	}
}
```

Als Ausgabe liefert das Programm:

Text [Byte Format] : [B@19b5393
Text : No body can see me
Text Encryted : [B@4e79f1
Text Decryted : No body can see me


Nun zu meinem Problem: Ich möchte aus diesem Programm zwei Programme machen und zwar ein Programm, das nur verschlüsselt und eins das nur entschlüsselt. Das Verschlüsselungsprogramm habe ich glaube ich soweit hinbekommen (s. Code):


```
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;


public class encrypt {
	
	public static void main(String[] args) {
		 
		try{
 
		    KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
		    SecretKey myDesKey = keygenerator.generateKey();
 
		    Cipher desCipher;
 
		    // Create the cipher 
		    desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
 
		    // Initialize the cipher for encryption
		    desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
 
		    //sensitive information
		    byte[] text = "No body can see me".getBytes();
		       
		    System.out.println("Text [Byte Format] : " + text);
		    System.out.println("Text : " + new String(text));
		    
		 // Encrypt the text
		    byte[] textEncrypted = desCipher.doFinal(text);
		    System.out.println("Text Encrypted : " + textEncrypted);
 
 
		}catch(NoSuchAlgorithmException e){
			e.printStackTrace();
		}catch(NoSuchPaddingException e){
			e.printStackTrace();
		}catch(InvalidKeyException e){
			e.printStackTrace();
		}catch(IllegalBlockSizeException e){
			e.printStackTrace();
		}catch(BadPaddingException e){
			e.printStackTrace();
		} 
	}
}
```

Ausgabe: 
Text [Byte Format] : [B@1a0c10f
Text : No body can see me
Text Encrypted : [B@aa9835


Das Entschlüsselungs-Programm kriege ich irgendwie nicht hin. Bitte helft mir, habe null Ahnung von Programmieren.

Danke im Voraus
lg
natalie


----------



## HoaX (10. Mrz 2011)

guestN hat gesagt.:


> Das Entschlüsselungs-Programm kriege ich irgendwie nicht hin. Bitte helft mir, habe null Ahnung von Programmieren.



Dann zeig doch mal was du versucht hast und wo es hängt. Ansonsten such dir doch was einfacheres um Java zu lernen.


----------



## kay73 (10. Mrz 2011)

Was willst Du denn genau machen? 
Ist es notwendig, das zu programmieren? Vielleicht gibt es eine Standardanwendung, die Dein Problem lösen kann.


----------



## guestN (10. Mrz 2011)

Ich möchte Daten pseudonymisieren, die bei Bedarf wieder in Ursprungsform verwandelt werden können.

Ich habe folgendes versucht:

```
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
 
public class decrypt
{    
	public static void main(String[] argv) {
 
		try{
 
		    Cipher desCipher;
                    
                    //hier gebe ich die Informationen ein, die der Verschlüsselung entstammen
		    myDesKey = "com.sun.crypto.provider.DESKey@fffe78b2";
		    textEncrypted = "[B@10dd1f7";
                    desCipher = "javax.crypto.Cipher@1bf6770";
 
		    // Initialize the same cipher for decryption
		    desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
 
		    // Decrypt the text
		    byte[] textDecrypted = desCipher.doFinal(textEncrypted);
		    
		    System.out.println("Text Decrypted : " + new String(textDecrypted));
 
		}catch(NoSuchAlgorithmException e){
			e.printStackTrace();
		}catch(NoSuchPaddingException e){
			e.printStackTrace();
		}catch(InvalidKeyException e){
			e.printStackTrace();
		}catch(IllegalBlockSizeException e){
			e.printStackTrace();
		}catch(BadPaddingException e){
			e.printStackTrace();
		} 
		    
	}
}
```

Ich versuchte mittels der Informationen, die der Verschlüsselung enstammen, die Entschlüsselung durchzuführen, allerdings läuft es nicht, da ich nicht weiß von welchem Datentypen "myDesKey", "textEncrypted" und "desCipher" und wie ich sie übergeben soll.
Bin ich denn wenigstens ansatzweise auf dem richtigen Weg?


----------



## Dit_ (11. Mrz 2011)

```
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
 
public class JEncrytion
{    
    public static void main(String[] argv) {
 
        try{
 
            KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
            SecretKey myDesKey = keygenerator.generateKey();
 
            Cipher desCipher;
 
            // Create the cipher 
            desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
 
            // Initialize the cipher for encryption
            desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
 
            //sensitive information
            byte[] text = "No body can see me".getBytes();
 
            System.out.println("Text [Byte Format] : " + text);
            System.out.println("Text : " + new String(text));
 
            // Encrypt the text
            byte[] textEncrypted = desCipher.doFinal(text);
 
            System.out.println("Text Encryted : " + textEncrypted);
 
            // Initialize the same cipher for decryption
            desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
 
            // Decrypt the text
            byte[] textDecrypted = desCipher.doFinal(textEncrypted);
 
            System.out.println("Text Decryted : " + new String(textDecrypted));
 
        }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
        }catch(NoSuchPaddingException e){
            e.printStackTrace();
        }catch(InvalidKeyException e){
            e.printStackTrace();
        }catch(IllegalBlockSizeException e){
            e.printStackTrace();
        }catch(BadPaddingException e){
            e.printStackTrace();
        } 
    }
}
```


von Zeile  25 bis 36 ist das Programm zum verschluesseln, Rest ist zum entschluesseln. Du muss also einfach aufteilen. Bis Zeile 25 bleibt alles gleich in beiden Programmen.


----------



## guestN (11. Mrz 2011)

So einfach kann ich das ja nicht aufteilen. Wie man bei der Decryption sieht, werden dort Informationen von der Encryption (textEncrypted) benötigt:

```
// Initialize the same cipher for decryption
desCipher.init(Cipher.DECRYPT_MODE, myDesKey);

// Decrypt the text
byte[] textDecrypted = desCipher.doFinal(textEncrypted);
```

d.h. das auch "myDesKey" und "desCipher" benötigt werden.


z.B. verschlüssele ich den Text "Max Mustermann" und erhalte folgende Ausgabe:

desCipher: javax.crypto.Cipher@1201a25
myDesKey: com.sun.crypto.provider.DESKey@fffe7b57
Text Encrypted : [B@10dd1f7

"Max Mustermann" wird nun durch "KundenID: [B@10dd1f7" ersetzt. desCipher und myDesKey soll separat gespeichert werden. Bei Bedarf sollen diese Daten benutzt werden um den verschlüsselten Text wieder zu entschlüsseln, d.h. als Ergebnis "Max Mustermann". 
So sieht mein Entschlüsselungs-Programm aus:


```
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
 
public class decrypt
{    
	public static void main(String[] argv) {
 
		try{
 
		    Cipher desCipher;
		    
		    desCipher = "javax.crypto.Cipher@1201a25"
		    myDesKey = "com.sun.crypto.provider.DESKey@fffe7b57";
		    textEncrypted = "[B@10dd1f7";
 
		    // Initialize the same cipher for decryption
		    desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
 
		    // Decrypt the text
		    byte[] textDecrypted = desCipher.doFinal(textEncrypted);
		    
		    System.out.println("Text Decrypted : " + new String(textDecrypted));
 
		}catch(NoSuchAlgorithmException e){
			e.printStackTrace();
		}catch(NoSuchPaddingException e){
			e.printStackTrace();
		}catch(InvalidKeyException e){
			e.printStackTrace();
		}catch(IllegalBlockSizeException e){
			e.printStackTrace();
		}catch(BadPaddingException e){
			e.printStackTrace();
		}     
	}
}
```

Nun benötige ich Hilfe, da ich nicht weiß, wie ich diese Informationen beim Entschlüsselungsprogramm richtig übergebe, um wieder "Max Mustermann" zu erhalten.

lg 
guestN


----------



## Volvagia (11. Mrz 2011)

Schau dir mal die Methode Object#toString an, dann kannst du dahinter kommen, was du den ganzen Thread über falsch machst. (Sollst ja was lernen. :bae


----------



## despikyxd (12. Mrz 2011)

hehe ... kann mich meinem vor-poster nur anschließen ...
war im ersten post noch nicht verwundert über das einfach toString()
als ich dann aber die folgende zeile las war klar was du falsch machst

myDesKey = "com.sun.crypto.provider.DESKey@fffe78b2";

ich geb dir mal n kleinen hint : die toString methode macht nichts weiter als Class.getName() + @ + Object.hashCode() zuerzeugen *zumindest in der unüberschriebenen methode in Object*

als weitere anmerkung : DES ist schon jahrelang veraltet ...
du solltest lieber AES verwenden ... und dann auch nicht mit ECB sondern CBC - modus ... pkcs5padding ist in ordnung

falls du dir mal n fertiges system angucken willst : http://www.java-forum.org/allgemeine-java-themen/112839-netzwerk-sicherheit-hybrid-kryptosystem.html

zwar nicht kommentiert und keine doc dabei *und auch noch rechtschreibfehler : müsste receive statt recieve heißen ^^* aber so in etwa sieht sowas aus ...

was dein wunsch nach splitting angeht : du kannst sowohl verschlüsselung als auch entschlüsselung in einer gemeinsamen klasse vereinen ... und dann halt lediglich caller-klassen drum rum bauen die dann halt nur verschlüsselung oder nur entschlüsselung aufrufen


----------

