Verschlüsselung mit Cipher

mannni10

Mitglied
Hallo allerseits,

ich habe folgendes Problem: Ich habe eine XML Datei in die ich Daten via Java reinschreibe.
Nun ist mir aufgefallen, das diese völlig unverschlüsselt auf der Festplatte liegt. Also habe ich mich dran gemacht die Datei zu verschlüsseln.

Das sieht folgender maßen aus:

Java:
public static void cryptAll() throws JAXBException, IOException,
			InvalidKeyException, NoSuchAlgorithmException,
			NoSuchPaddingException, IllegalBlockSizeException,
			BadPaddingException {
		// Dateiinhalt einlesen und in Variable "datei" speichern.
		String s = "";
		StringBuffer datei = new StringBuffer();
		BufferedReader in = new BufferedReader(new FileReader(Pfad
				.getInstance().getPfad()
				+ "\\KeyAdministration\\applications.xml"));
		while ((s = in.readLine()) != null) {
			datei.append(in.readLine() + System.getProperty("line.separator"));
		}
		// Daten in einen String speichern
		String apps = datei.toString();
		// Daten verschlüsseln
		byte[] cryptApp = encrypt(apps);
		// Daten wieder in file schreiben
		in.close();
		file = new File(Pfad.getInstance().getPfad()
				+ "\\KeyAdministration\\applications.xml");
		try {
			writer = new FileWriter(file);

			for (int i = 0; i < cryptApp.length; i++) {
				writer.write("" + cryptApp[i] + ",");
				writer.write(System.getProperty("line.separator"));
				writer.flush();
			}
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
}

public static void decryptAll() throws IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException{
			//Verschlüsselte Datei auslesen und in Variable datei speichern
			String s = ""; 
	        StringBuffer datei = new StringBuffer();
	        BufferedReader in = new BufferedReader(new FileReader(Pfad.getInstance().getPfad()+"\\KeyAdministration\\applications.xml")); 
	        while((s = in.readLine()) != null){
	           datei = datei.append(s); 
	        } 
	        String apps = datei.toString();
	        //Variable splitten
	        String[] decApps = apps.split(",");
	        //Variable in einem byte Array speichern
	        cryptApp = new byte[decApps.length];
        	for (int i = 0; i<decApps.length;i++){
	        	int x = Integer.parseInt(decApps[i]);
	        	cryptApp[i] = convertIntToByteArray(x);
	        }
        	//Daten wieder entschlüsseln und in die Datei zurück schreiben!
	        String decoded = decrypt(cryptApp);
	        in.close();
			  file = new File(Pfad.getInstance().getPfad()+"\\KeyAdministration\\applications.xml");
			     try {
			       writer = new FileWriter(file);
			       
				       writer.write(decoded);
				       writer.flush();
//			       }
			       writer.close();
			    } catch (IOException e) {
			      e.printStackTrace();
			    }
}

public static byte[] encrypt(String args) throws NoSuchAlgorithmException, NoSuchPaddingException, IOException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
		byte[] bytes = args.getBytes();
		c = Cipher.getInstance( "DES" );
		java.security.Key k = new SecretKeySpec( getSchluessel().getBytes(), "DES" );
	    c.init( Cipher.ENCRYPT_MODE, k );
	    byte[] encoded = c.doFinal(bytes);
	    System.out.println(encoded);
	    
	    return encoded;
	}
	
	public static String decrypt(byte[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
		c = Cipher.getInstance( "DES" );
		java.security.Key k = new SecretKeySpec( getSchluessel().getBytes(), "DES" );
	    c.init( Cipher.DECRYPT_MODE, k );
	    byte[] bytes = c.doFinal(args);
	    String decoded = new String(bytes);
	    System.out.println(decoded);
	    
	    return decoded;
	}

	public static String getSchluessel() {
		return schluessel;
	}

 private static byte convertIntToByteArray(int val) {
        byte[] buffer = new byte[4];
   
        buffer[0] = (byte) (val >>> 24);
        buffer[1] = (byte) (val >>> 16);
        buffer[2] = (byte) (val >>> 8);
        buffer[3] = (byte) val;
        
        return buffer[3];
}

Mein Problem ist jetzt: Es kommt immer etwas anderes raus als vor der Verschlüsselung drin stand.
Kann mir jemand sagen was der Fehler ist?
Und wenn wir schon dabei sind: Mein Code sieht vielleicht nicht gerade Professionell aus, wenn jemand Verbesserungsvorschläge hat, nur raus damit!

Vielen Dank schon einmal im Voraus.

Gruß, Manni
 
Es ist zwar nicht wirklich die Antwort aber trotzdem ganz gut zu wissen, wie ich finde:

Der Verschlüsselungsverfahren ist nicht sehr effizient und sinnvoll würde ich sagen. Warum speicherst du die Daten nicht direkt binär sondern repräsentierst sie als String? Deine Datei ist bestimmt 4-mal so groß wie eine normal verschlüsselte.

Außerdem könnte ein Fehler sein, dass du beim Verschlüsseln nach jedem Byte eine neue Zeile anfängst, diese aber beim Entschlüsseln nicht beachtest, oder?
 
http://www.java-forum.org/allgemeine-java-themen/137796-verwendung-cipher-gnu-crypto-serpent.html#post911986

Zufälligerweise habe ich vor kurzem auch so ein ähnliches Problem gehabt.
Wenn du willst kannst du ja diesen Code verwenden.

So könnte das Zum Bleistift aussehen.
Java:
String password="spam";
FileInputStream fileInputStream=new FileInputStream("C:\\some.xml");
FileOutputStream fileInputStream=new FileOutputStream("C:\\some.xml.encrypted");
CryptographyModule.encrypt(fileInputStream, fileOutputStream, password.getBytes());
fileOutputStream.close();
fileInputStream.close();

Der Rest sollte selbsterklärend sein (gnu-crypto musst du allerdings noch aus dem Web beziehen und in deinen Classpath einbinden).
 
Hallo liebe leuts,

leider habe ich erneut ein Problem mit der Verschlüsselung.
Da ich beschlossen habe die Daten in der Datei nicht zu entschlüsseln, sondern nur einzulesen und dann zu entschlüsseln (das sie nicht offen herumliegen während das Programm läuft) bin ich wieder auf mein altes Verschlüsselungsverfahren umgestiegen.

Hierbei gehe ich wie folgt vor:

Java:
//Hier frage ich ab ob die Datei existiert, falls ja wird die Methode zum entschlüsseln aufgerufen
File keyFile = new File(Pfad.getInstance().getPfad() + "\\KeyAdministration\\keys.xml");
		if (keyFile.exists())
			Crypt.decryptData(keyFile.getPath());

Java:
//Hier die Methode zum einlesen der Datei:
public static String decryptData(String path) throws IOException, InvalidKeyException,
			NoSuchAlgorithmException, NoSuchPaddingException,
			IllegalBlockSizeException, BadPaddingException, JAXBException {
			//Verschlüsselte Datei auslesen und in Variable datei speichern
			String s = ""; 
			StringBuffer datei = new StringBuffer();
	        File file = new File(path);
	        if (file.exists()){
	        BufferedReader in = new BufferedReader(new FileReader(file)); 
	        while((s = in.readLine()) != null){
	           datei = datei.append(s); 
	        }
	        String data = datei.toString();
	        //Variable splitten
	        String[] dataArray = data.split(",");
	        //Variable in einem byte Array speichern
	        cryptData = new byte[dataArray.length];
        	for (int i = 0; i<dataArray.length;i++){
	        	int x = Integer.parseInt(dataArray[i]);
	        	cryptData[i] = convertIntToByteArray(x);
	        }
        	//Entschlüsselungsmethode
	        decoded = decrypt(cryptData);
	        in.close(); 
	        }
			return decoded;
	}

//Und hier die Methode zum entschlüsseln
public static String decrypt(byte[] args) throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException,
			IllegalBlockSizeException, BadPaddingException, IOException {
		Cipher c = Cipher.getInstance("DES");
		java.security.Key k = new SecretKeySpec(getSchluessel().getBytes(),
				"DES");
		c.init(Cipher.DECRYPT_MODE, k);
		byte[] bytes = c.doFinal(args);
		String decoded = new String(bytes);
		System.out.println(decoded);

		return decoded;
	}

Es funktioniert auch alles wunderbar, sprich: einlesen, umwandeln ...
Allerdings bekomme ich trotz alle dem ein bytes im String zurück und nicht den entschlüsselten String!
Beim debuggen ist die decoded Variable in der die entschlüsselte Zeichenkette stehen sollte null und danach stehen Zahlen drin :-/
Kann mit da jemand helfen? Ich finde den Fehler nicht 🙁

Vielen Dank und Liebe Grüße
Manni 😉
 

Zurück
Oben