# Daten übers Netz verschlüsselt übertragen? Wie?



## madman (30. Aug 2007)

Hallo,

ich stehe grad vor dem Problem wie man Daten verschlüsselt übers Netz übertragen kann.
Die Datei liegt auf einem IIS im Intranet. Nur der Admin kommt an die Datei und kann Sie lesen. 
Die Daten sollen auf Ihrem Weg durchs Netz verschlüsselt übertragen werden. Auf dem Client sollen sie für die Weiterverarbeitung wieder entschlüsselt werden. 
Habe schon die Suche strapaziert aber keine befriedigende Lösung gefunden.
Kennt vieleicht jemand einen ersten Lösungsansatz oder ein Beispiel?

Bin für jeden Hinweis dankbar. 

Gruß
Mike


```
String nextLine;
		 URL url = null;
		 URLConnection urlConn = null;
		 InputStreamReader  inStream = null;
		 BufferedReader buff = null;
			 try{
				    url  = new URL("http://localhost/conf/setting.conf" );
				    urlConn = url.openConnection();
				    inStream = new InputStreamReader(urlConn.getInputStream());
				    buff = new BufferedReader(inStream);
			     
			     //Verschlüsselte Übertagung? Wie
			     
			     //Entschlüsseln und zeilenweises auslesen
			     
			      while ((nextLine = buff.readLine()) != null) {
					      }
				} catch(MalformedURLException e){
				 System.out.println("URL überprüfen: " + e.toString() );
			} catch(IOException  e1){
			System.out.println("Connection failt: "+ e1.toString() ); 
		}
```


----------



## AlArenal (30. Aug 2007)

Warum benutzt ihr nicht einfach HTTPS?


----------



## Guest (30. Aug 2007)

Hi AlArenal,

sorry irgendwie steh ich grad auf der Leitung. Hab ich das richtig gemacht oder hast du was anderes gemeint?

Meldung:
Please check the URL:javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

Hast du ne Idee?



```
String nextLine;
       URL url = null;
       URLConnection urlConn = null;
       InputStreamReader  inStream = null;
       BufferedReader buff = null;
          try{

                url  = new URL("http://localhost/conf/setting.conf" );
                urlConn = (HttpsURLConnection)url.openConnection(); 

                inStream = new InputStreamReader(urlConn.getInputStream());
                buff = new BufferedReader(inStream);
              
              //Verschlüsselte Übertagung? Wie
              
              //Entschlüsseln und zeilenweises auslesen
              
               while ((nextLine = buff.readLine()) != null) {
                     }
            } catch(MalformedURLException e){
             System.out.println("URL überprüfen: " + e.toString() );
         } catch(IOException  e1){
         System.out.println("Connection failt: "+ e1.toString() );
      }
```


----------



## sparrow (30. Aug 2007)

SSL bedeutet aber auch, dass der Server entsprechend verschlüsseln muss.


----------



## madman (30. Aug 2007)

Hi,

das ist dann wohl auch das Problem. Somit kann ich kein SSL verwenden. Danke. 
Gibt es sonst noch eine andere Möglichkeit einen InputStreamReader zu verschlüsseln? 

Gruß
Mike


----------



## Wildcard (30. Aug 2007)

Logischerweise muss die eine Seite verschlüsseln, und die andere entschlüsseln  :wink:


----------



## tuxedo (31. Aug 2007)

Jupp, Server verschlüsselt -->Übertragung--> Client entschlüsselt.

Am Client verschlüsseln geht, aber macht natürlich wenig Sinn LOL ...

Und wenn du nur via HTTP dran kommst (also kein Java-Tool oder ähnliches auf dem Server laufen lassen kannst), und der IIS kein SSL macht, dann bleibt dir nur der zwischenschritt über ein Script (PHP oder ähnliches), mit welchem du die Datei anforderst:

GET-Anfrage an das Script mit Namen der gewünschten Datei -> Script öffnet die Datei, verschlüsselt diese und gibt die Daten an den Client zurück. Der Client empfängt die Daten und entschlüsselt diese.

- Alex


----------



## NTB (4. Sep 2007)

Wenn die Datei eh auf dem Server so offen liegt, dass Du sie direkt lesen kannst, braucht sie auch nicht mehr verschlüsselt werden, denn dann kann sie sowieso jeder lesen.


----------



## tuxedo (4. Sep 2007)

Jo, das kommt noch hinzu. Wenn das Verzeichnis allerdings nicht eingesehen werden kann, und keiner weiß dass es die Datei gibt, dann kann sie auch nicht jeder runterladen  (naja, können schon, aber da's niemand weiß...).


----------



## madman (6. Sep 2007)

Hallo zusammen,

ich wollte mich bei euch für eure Ideen bedanken. Die Tipps waren sehr hilfreich. Ich verschlüssele jetzt User und Passwort in eine datei "db.conf", liegend in einem Verzeichnis des IIS. Das Applet liest über urlConn.getInputStream() die Datei zeilenweise aus und entschlüsselt diese wieder. Für die Verschlüsselung nehme ich einen einfaches Verschiebechiffre. Ist mir schon klar, dass es nicht sicher ist. Zielsetzung war eben die Daten nicht im Klartext über Netz zu schicken. Diese Zielsetzung ist erfüllt. 

Gruß
Mike


----------



## tuxedo (6. Sep 2007)

Ganz ehrlich? Die Verschlüsselung hättest du dir sparen können. Weil der, der sich die Arbeit macht die Pakete zu sniffen, für den ist es dann auch ein Kinderspiel dein Verschiebechiffre zu lösen. 

Wenn du schon verschlüsselst, dann solltest du du wenigstens mit XOR verschlüsseln und einem ziemlich langen Schlüssel nehmen (kurze Schlüssel sind zu leicht zu knacken bei zu viel verschlüsselten Daten). Das ist dann schon aufwendiger zu knacken und macht man "nicht mal eben in 15min". 

- Alex


----------



## SlaterB (6. Sep 2007)

nun ja, es macht doch einen sehr großen Unterschied,
ob man beliebige Daten der Form 'hello world' oder der Form 'gsdk füxvv' liest,

ein gewisser Anteil selbst unter Sniffer-Usern weiß nix von der Verschlüsselung
und noch ein bedeutender Anteil würde sich nicht die Mühe machen, da aufwendig extra noch zu entschlüsseln,
selbst wenn es nur 1 Min. dauert: in der Zeit kann man 10 andere unverschlüsselte Nachrichten lesen 
und größere Mengen an Daten bekommt man auch nicht unbedingt auf einen Schlag (edit: ok, für Verschiebung kaum nötig),

ist natürlich generell die Frage wer da mit welchen Intentionen snifft,
aber 'Zielsetzung war eben die Daten nicht im Klartext über Netz zu schicken.' klingt nach ganz allgemeiner anonymer Übertragung mit Verschlüsselung gegen beliebige unbekannte Mitleser

also: ist nicht sicher aber GANZ was anderes als Klartextübertragung,


-------

andererseits könnten verschlüsselte Nachrichten gerade das bösartige Interesse oder schlicht die Neugier der Sniffer erwecken,
insofern ist eine zu leichte Verschlüsselung dann doch kontraproduktiv?


----------



## tuxedo (6. Sep 2007)

Ich mein ja nur: Mit nur ein klitzeklein wenig mehr Aufwand ist die Verschlüsselung gleich um ein vielfaches sicherer. 

Wenn man nicht massig Daten überträgt, und einen nicht zu kleinen Schlüssel wählt (am besten wäre es, der Schlüssel wäre so lang wie die zu verschlüsselnden Daten selbst), ist XOR nicht wirklich zu knacken.

- Alex


----------



## madman (7. Sep 2007)

Hallo,

ja hab mir das Ganze nochmal überlegt und es folgender maßen probiert. Irgendwie dachte ich mir, das Ihr recht habt und son Verschiebechiffre schon ziemlich fürn A**** ist. Ich verwende jetzt Cipher. Dabei war mir das Kapitel in dem Buch Verschlüsseln von Datenströmen  eine große Hilfe. Versuche hier eben aus klar.conf zeilenweise auszulese, um in crypto.conf sofort zeilenweise die verschlüsselten Daten zu schreiben. Wenn nur eine Zeile in der Datei klar.conf steht funzt das Ganze auch, macht aber so keinen Sinn. Bei 2 Zeilen geschieht etwas merkwürdiges. Dies sieht man sehr deutlich in der Ausgabe. Das Array dient nur der Kontrolle.

Scheinbar funktioniert das zeilenweise Auslesen der Datei, aber beim encodieren läuft was schief. Nämlich kann man beobachten, dass zeilenweise ausgelesen wird, aber bei der 2ten zeile "password" sich plötzlich die Codierung der ersten Zeile "username" = "F2iFhcujnYkIu122s3wG1" in der verschlüsselten Zeile wiederfindet. 

Wie kann das sein? Ich bin echt sprachlos. Weiss vielleicht jemand Rat? 
Auf Wunsch kann ich auch noch den vollständigen Code mit Ausgabe zum entschlüsseln posten.
Vielen Dank!

Gruß
Mike

Konsolenausgabe von WriteDES:
--------------------------------------------
zeile klartext: username
zeile verschlüsselt: F2iFhcujnYkIu122s3wG1w==
--------------------------------------------
zeile klartext: password
zeile verschlüsselt: F2iFhcujnYkIu122s3wG18Vagbu8OJ13CLtdtrN8Btc=
--------------------------------------------
array: [F2iFhcujnYkIu122s3wG1w==, F2iFhcujnYkIu122s3wG18Vagbu8OJ13CLtdtrN8Btc=]
arrayGröße:2
username: F2iFhcujnYkIu122s3wG1w==
password: F2iFhcujnYkIu122s3wG18Vagbu8OJ13CLtdtrN8Btc=



```
import java.io.*; 
import java.security.Key; 
import java.util.ArrayList;
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 
import sun.misc.*; 
 
public class WriteDES 
{ 
	static File klar;
    static File chiffre;
    static ArrayList daten = new ArrayList();
		
	 public static void main( String[] args ) throws Exception 
	  { 
		 String zeile = null;
         klar = new File("D:\\Crypto\\klar.conf");
         FileReader fr = new FileReader(klar);
         BufferedReader br = new BufferedReader(fr);
         ByteArrayOutputStream out = new ByteArrayOutputStream(); 
         
         chiffre = new File("D:Crypto\\crypto.conf");
         FileOutputStream fout = new FileOutputStream(chiffre);
	     OutputStreamWriter osw = new OutputStreamWriter(fout, "UTF-8");
	     BufferedWriter bw = new BufferedWriter(osw);  

         while ((zeile = br.readLine()) != null){
            System.out.println("plain: " + zeile );
     	    encode( zeile.getBytes(), out, "01234567" ); 
     	    
     	    String s = new BASE64Encoder().encode( out.toByteArray() ); 
     	    System.out.println("verschlüsselt: " + s );  
     	    daten.add(s);
         	bw.write(s); 
         	bw.newLine(); 
        }
         br.close(); 
         bw.close(); 
         System.out.println("array: " + daten);
         System.out.println("arrayGröße:" + daten.size()); 
         
         String username = (String) daten.get(0); 
         String password = (String) daten.get(1); 
         
         System.out.println("username: " +username);
         System.out.println("password: " +password);
  } 

  static void encode( byte[] bytes, OutputStream out, String pass ) throws Exception 
  { 
    Cipher c = Cipher.getInstance( "DES" ); 
    Key k = new SecretKeySpec( pass.getBytes(), "DES" ); 
    c.init( Cipher.ENCRYPT_MODE, k ); 
 
    OutputStream cos = new CipherOutputStream( out, c ); 
    cos.write( bytes ); 
    cos.close(); 
  } 
 
  
  static byte[] decode( InputStream is, String pass ) throws Exception 
  { 
    Cipher c = Cipher.getInstance( "DES" ); 
    Key k = new SecretKeySpec( pass.getBytes(), "DES" ); 
    c.init( Cipher.DECRYPT_MODE, k ); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    CipherInputStream cis = new CipherInputStream( is, c ); 

    for ( int b; (b = cis.read()) != -1; ) 
      bos.write( b ); 
 
    cis.close(); 
    return bos.toByteArray(); 
  }  
}
```


----------



## SlaterB (7. Sep 2007)

erstl ein megakomplexes Programm schreiben und dann über die Java-Grundlagen nachdenken, was?

versuche mal, das gleiche Problem im folgenden Programm ebenso wiederzufinden:

```
public class Test2
{

    public static void main(String[] args)
        throws Exception
    {
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        out.write(new byte[] {2, 3, 4});
        System.out.println(Arrays.toString(out.toByteArray()));

        out.write(new byte[] {5, 6, 7});
        System.out.println(Arrays.toString(out.toByteArray()));
    }
}

Ausgabe:
[2, 3, 4]
[2, 3, 4, 5, 6, 7]
```


----------



## madman (7. Sep 2007)

Hallo,

danke für den Hinweis. Jetzt klappts!

Die Zeile  
	
	
	
	





```
ByteArrayOutputStream out = new ByteArrayOutputStream();
```
  gehört natürlich in die while-Schleife.

Gruß
Mike


----------



## tuxedo (7. Sep 2007)

Du musst ja nicht unbedingt zeilenweise arbeiten. Du kannst auch die ganze File (nach und nach) als byte[] einlesen, das alles in den Stream stecken, und das was raus kommt, wieder byte[] weise in die File schreiben. Rückwärts genauso.

- Alex


----------



## madman (8. Sep 2007)

Hi,

hab leider nicht die Zeit umzubauen. Mir ist aber beim Compilieren folgende Fehlermeldung aufgefallen:


```
myApplet.java:704: warning: sun.misc.BASE64Decoder is Sun proprietary API and may be removed in a future release
byte[] decode = new BASE64Decoder().decodeBuffer( zeile );
```

Heisst das etwa, dass vielleicht irgendwann mal sun.misc.BASE64Decoder nicht mehr unterstützt wird? Oder die Meldung einfach ignorieren?

Gruß
Mike


----------



## Wildcard (8. Sep 2007)

http://java.sun.com/products/jdk/faq/faq-sun-packages.html


----------

