# Ver/entschlüsseln von dateien



## rachid1981 (8. Jul 2011)

versuche gerede hier Inhalt ein verschlüsselte datei zu entschlüsseln und ausgeben
kann mir bitte jemand sagen warum das nicht funktioniert
danke im voraus

String zeile1;
BufferedReader dec = new BufferedReader(new FileReader(
				"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/verschtest.txt"));
while((zeile1 = dec.readLine()) != null) {
			System.out.println("DEcode :" + zeile1);
			InputStream bais = new ByteArrayInputStream(zeile1.getBytes());
			decode(bais, "01234567");
			byte[] s = new sun.misc.BASE64Decoder().decodeBuffer(bais);
			System.out.println("entschlüsselt : " + s.toString());

		}
static byte[] decode(InputStream is, String pass) throws Exception {
		Cipher c = Cipher.getInstance("DES");
		SecretKeySpec 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);
		}


----------



## Marcinek (8. Jul 2011)

rachid1981 hat gesagt.:


> problem bei mir nur beim entschlüsseln



Grob gesagt: Nicht dein einziges Problem.

1. Verwende bitte Javatag steht ganz groß vor dem posten.

2. Wenn es ein Problem beim entschlüsseln gibt, dann würde ich dort schauen nach der Lösung.


----------



## rachid1981 (8. Jul 2011)

oh ja Sorry wusste ich nicht


```
String zeile = null;
		String zeile1;
		BufferedReader in = new BufferedReader(new FileReader(
				"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/test.txt"));

		BufferedReader dec = new BufferedReader(new FileReader(
				"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/verschtest.txt"));

		
		chiffre = new File("D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/verschtest.txt");

		FileOutputStream fout = new FileOutputStream(chiffre);
		OutputStreamWriter osw = new OutputStreamWriter(fout, "UTF-8");
		BufferedWriter bw = new BufferedWriter(osw);

		while((zeile = in.readLine()) != null) {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			System.out.println("plain: " + zeile);
			encode(zeile.getBytes(), out, "01234567");

			String s = new sun.misc.BASE64Encoder().encode(out.toByteArray());

			System.out.println("verschlüsselt: " + s);
			daten.add(s);
			bw.write(s);
			bw.newLine();
		}
		in.close();
		bw.close();
		
				while((zeile1 = dec.readLine()) != null) {
			//ByteArrayInputStream byt = new ByteArrayInputStream(null);
			System.out.println("DEcode :" + zeile1);
			InputStream bais = new ByteArrayInputStream(zeile1.getBytes());
			decode(bais, "01234567");
			byte[] s = new sun.misc.BASE64Decoder().decodeBuffer(bais);
			System.out.println("entschlüsselt : " + new String(s));

		}
	}


	static void encode(byte[] bytes, OutputStream out, String pass)
			throws Exception {
		Cipher c = Cipher.getInstance("DES");
		SecretKeySpec 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");
		SecretKeySpec 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();
	}
```


----------



## Tomate_Salat (8. Jul 2011)

Thread.reset(); :joke: scnr

Ungetestet. Auch wenn ich seltenst mit Verschlüsselungen arbeite, aber: Ich denke es liegt daran, dass du einen neuen SecretKeySpec erstellst. Wäre auch iwie sinnfrei, wenn du mit jedem Schlüssel die Datei wieder entschlüsseln könntest.


----------



## rachid1981 (8. Jul 2011)

danke aber liegt nicht dran, habe es gerade geändert trotzdem geht net
freue mich auf irgendwelche neue Idee


----------



## SlaterB (8. Jul 2011)

du reihst wahllos Befehle aneinander, ohne richtiges Konzept, Verschlüsseln geht ja noch,  wenn von dir dann gut, 
aber Entschlüsseln musst du dann konzentriert passend aufbauen,
wenn beim Verschlüsseln ganz am Ende BASE64Encoder ankommt damit ein schöner String gespeichert werden kann,
dann muss beim Entschlüsseln das BASE64Decode als erstes passieren, um diesen Schritt umzukehren! usw.

da ich jetzt so viel ausprobiert habe schreibe ich den ganzen Code:

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        String zeile;
        String zeile1;
        StringReader r = new StringReader("Hello World");
        BufferedReader in = new BufferedReader(r);


        File chiffre = new File("verschtest.txt");

        FileOutputStream fout = new FileOutputStream(chiffre);
        OutputStreamWriter osw = new OutputStreamWriter(fout, "UTF-8");
        BufferedWriter bw = new BufferedWriter(osw);

        while ((zeile = in.readLine()) != null)
        {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            System.out.println("plain: " + zeile);
            byte[] b1 = zeile.getBytes();
            System.out.println("b1: " + b1.length + " - " + Arrays.toString(b1));
            encode(zeile.getBytes(), out, "01234567");
            byte[] b2 = out.toByteArray();
            System.out.println("b2: " + b2.length + " - " + Arrays.toString(b2));
            String st = new sun.misc.BASE64Encoder().encode(b2);

            System.out.println("verschlüsselt: " + st);
            bw.write(st);
            bw.newLine();
        }
        in.close();
        bw.close();

        System.out.println("--------------");

        BufferedReader dec = new BufferedReader(new FileReader(chiffre));

        while ((zeile1 = dec.readLine()) != null)
        {
            System.out.println("DEcode       : " + zeile1);
            byte[] b2 = new sun.misc.BASE64Decoder().decodeBuffer(zeile1);
            System.out.println("b2: " + b2.length + " - " + Arrays.toString(b2));

            InputStream bais = new ByteArrayInputStream(b2);
            byte[] b1 = decode(bais, "01234567");
            System.out.println("b1: " + b1.length + " - " + Arrays.toString(b1));

            System.out.println("entschlüsselt: " + new String(b1));

        }
    }

    static void encode(byte[] bytes, OutputStream out, String pass)
        throws Exception
    {
        Cipher c = Cipher.getInstance("DES");
        SecretKeySpec 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");
        SecretKeySpec 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();
    }
}
```
Ausgabe:

```
plain: Hello World
b1: 11 - [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
b2: 16 - [36, -42, 100, -97, 75, 41, -88, -12, -67, 41, -109, -96, -67, 64, -114, -90]
verschlüsselt: JNZkn0spqPS9KZOgvUCOpg==
--------------
DEcode       : JNZkn0spqPS9KZOgvUCOpg==
b2: 16 - [36, -42, 100, -97, 75, 41, -88, -12, -67, 41, -109, -96, -67, 64, -114, -90]
b1: 11 - [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
entschlüsselt: Hello World
```

edit: wenn der OutputStreamWriter UTF-8 ist, dann sollte das Lesen auch wieder mit UTF-8 passieren,
überall auf Symmetrie achten, wegen BASE64-Speicherung hier vielleicht egal/ unnötig


----------



## rachid1981 (8. Jul 2011)

SlaterB Danke Dir vielmal es finktionier


----------



## rachid1981 (11. Jul 2011)

hallo erstmal zusammen
also ich versuche mit dem selben cod ein word document zu ver/entschlüsseln aber geht nicht kann mir jemand bitte sagen warum und wie ich das löse 
also bei  .txt .xml funktioniert gut 
Danke


----------



## SlaterB (11. Jul 2011)

ein Word-Dokument bzw. alles was nicht mit Texteditor lesbar ist, darfst du nicht mit BufferedReader als String interpretiert einlesen,
dabei gehen Informationen verloren

da du aus dem String eh sofort bytes machen würdest kannst du aus einem InputStream direkt bytes lesen,
der Teil danach mit BASE64Encoder usw. ist nicht betroffen, achte nur auf korrektes Einlesen von Array b1 und am Ende auch b1 direkt speichern,
prüfe mit Ausgaben ob die Arrays gleichbleiben (evtl. nur den Anfang wenn Tausende bis Millionen..)

testweise kannst du auch erstmal nur b1 einlesen, ausgeben und gleich wieder speichern,
ist dann die Word-Datei noch korrekt?


----------



## rachid1981 (11. Jul 2011)

kannst du mir BITTE ein beispiel zeigen, ich weiss ganz ehrlich nicht wie ich das mache

habe versucht statt BufferedReader mit  InputStream  in = new FileInputStream(Datei)
aus dem datei zu lesen aber geht auch nicht
Danke dir


----------



## SlaterB (11. Jul 2011)

Suchmaschine: java fileinputstream example
oder es gibt auch Lehrücher..

wenn kein Beispiel mit Einlesen von größeren byte[] dabei ist, dann noch genauer suchen oder sag Bescheid


----------



## rachid1981 (11. Jul 2011)

```
InputStreamReader inn = new InputStreamReader(new FileInputStream(pfadDatei),
									"UTF8");
BufferedReader in = new BufferedReader(inn);
```
ich habe die datei jetzt so gelsen und den rest was ich nicht wie ich das mache
bitte um weitere hilfe


----------



## SlaterB (11. Jul 2011)

das BufferedReader stört hatte ich gesagt, oder?
hier von den Links speziell einen mit byte[]:
Copy a file with read(byte[] data) and write(byte[] data) : FileInputStreamFileJava Tutorial

grundsätzlich kannst du natürlich nichts 1:1 übernehmen 
sondern brauchst einen Kopf zum Denken, weswegen Computer selber ja nicht (gut) programmieren können,
du musst den Code verstehen (evtl. intelligente Fragen formulieren) und geeignet kopieren, 
überlegen welche Schleife wo hingehört, was mit jedem byte[] passiert, 
auf Sonderfälle wie nicht ganz gefülltes letztes Array achten usw.

all das kann man nicht erklären und ich werde es auch nicht für dich programmieren..

es gibt übrigens auch Lehrbücher mit langen Kapiteln voller wichtiger Details zu Dateien, Streams..,
'ich kann nix, bitte helfen' ist vollkommen unproduktiv


----------



## rachid1981 (12. Jul 2011)

Das alles war gar nicht nötig SlaterB


----------



## rachid1981 (13. Jul 2011)

```
public static byte[] encrypt(byte[] d, KeyPair keyPair) throws Exception {

		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
		int blocksize = cipher.getBlockSize();
		//byte[] inBytes = new byte[blocksize];

		byte[] encrypt = cipher.doFinal(d);

		return encrypt;

	}


	public static byte[] decrypt(byte[] d, KeyPair keyPair) throws Exception {

		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
		//cipher.update(d);

		byte[] decrypt = cipher.doFinal(d);

		return decrypt;

	}


	public static void main(String[] args) throws IOException, Exception {
		beispiel bp = new beispiel();
		KeyPair ke = KeyPairGenerator.getInstance("RSA").generateKeyPair();
		//KeyGenerator ke = KeyGenerator.getInstance("AES");

		//		SecureRandom random = SecureRandom.getInstance(null”SHA1PRNG”,”SUN”);

		//Verschlüsseln
		File file = new File("D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/hello.docx");

		FileInputStream fis = new FileInputStream(
						"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/hello.docx");
		FileOutputStream fos = new FileOutputStream(
						"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/verschtest.txt");

		byte[] encrypt = new byte[1];
		while(fis.read(encrypt) != -1) {

			fos.write(bp.encrypt(encrypt, ke));
		}

		System.out.println("Verschlüsselt");
		// entschlüsseln
		FileInputStream in = new FileInputStream(
				"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/verschtest.txt");
		FileOutputStream out = new FileOutputStream(
				"D:\\Workspace-Helios/JavaGlobals_7.0.0/globals/encryption/helloo.docx");
		byte[] decrypt = new byte[128];
		while(in.read(decrypt) != -1) {
			out.write(bp.decrypt(decrypt, ke));
		}
		System.out.println("Entschlüsselt");

	}
```
das funktioniert aber es ist sehr langsam bis er das entschlüsselt und wenn ich mein byte[] encrypt = new byte[1]; auf byte[] encrypt = new byte[128]; vergrössere dann krige ich ein fehler data ist gross
hat jemand eine Idee wie ich das löse?
Danke


----------



## Tomate_Salat (13. Jul 2011)

RSA ist wirklich langsam. Eine Möglichkeit wäre z.B. folgendes Szenario:
du verschlüsselt deine Daten mittels XOR
den Schlüssel für die XOR-Verschlüsselung verschlüsselst du mit RSA

Somit musst du zum ver/entschlüsseln nicht die kompletten Daten mittels RSA sichern, sondern nur den Schlüssel für die eigentl. verschlüsselung (ich hasse das Wort schlüssel mitlerweile).


----------



## rachid1981 (13. Jul 2011)

Problem gelöst danke euch(Hasse auch das wort schlüssel übrigens)


----------

