Erste Schritte Verschlüsseln

H

hilfesuchend

Gast
Hallo zusammen,

Ich habe ein kleines Problem bei einer Aufgabe, die ich von meinem Ausbilder bekommen habe.
Und zwar musste ich ein Programm schreiben, in dem ich eine Text-Datei einlese und dann den Inhalt wieder in eine neue Datei schreibe. Dies hat alles soweit ganz gut geklappt.
Java:
import java.io.*;
  
public class TXTdatei { 
  
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args)
    {
        File eingabe = new File ("C:\\Arbeit\\Beispieltext.txt"); 
        File ausgabe = new File ("C:\\Arbeit\\Beispieltext1.txt");
        
        try
        {
            System.out.println(eingabe);
            BufferedReader in = new BufferedReader(new FileReader(eingabe));
            String zeile = "";
            FileWriter writer= new FileWriter(ausgabe);
            while((zeile = in.readLine()) != null)
            {
                System.out.println(zeile);
	   writer.write(zeile);
            }
            writer.flush();
            writer.close();
        } catch (Exception e) {
            System.out.println("Fehler");
            e.printStackTrace();
        }
    } 
}
Diese Aufgabe soll ich nen erweitern.
Als nächstes soll ich eine Codierung einbauen, wo ich die Textdatei einlese, ein Codewort vergebe, mit dem C.wort den Text verschlüssel und alles wie oben in die neue Datei schreibe.

Habe mal nach werschlüsselungen etc bei google geguckt, finde aber nicht wirklich sinnvolle informationen für mich.

Kann mir BITTE jamand helfen?

em Codewort die verschlüsselte Datei wieder entschlüssel! ;)
 
Zuletzt bearbeitet von einem Moderator:
H

hilfesuchend

Gast
Okay, ich habe mir soweit alles durchgelesen, jetzt weiss ich jedoch immernoch nicht, was ich wie ich es in meinen Source-code einbauen muss.

Kann mir jemand dabei helfen? Für einen Erfahrenen wird das ja bestimmt nicht so schwer sein und nicht lange dauern
 
S

SlaterB

Gast
erfahren genug 'vigenere java code' oder ähnliches in eine Suchmaschine einzutippen?
nun gut, an dieser fachlichen Eignung will ich andere in Hoffnung auf Lernerfolg (wenigstens eine Suchmaschine zu nutzen) Anteil haben lassen ;)

führt z.B. zu
http://www.java-forum.org/allgemeine-java-themen/40528-programm-vigenere-verfahren.html
edit: da ich dort gerade
> if (ausfuehren == "verschluesseln")
lese: Strings immer mit equals vergleichen!


Forum-Suche gibts ja auch noch
 

dzim

Top Contributor
Let me google that for you

:p


Aber ernsthaft:
Ich hab mir auch mal ne Verschlüsselung in einem kleinem JavaFX 2 Programm gebastelt...

Hier findest du den Code:
https://github.com/bgmf/javafx-play.../dzim/jfx/util/EncryptionDecryptionUtils.java

Ich schließe mich SlaterB an, dass das alles mit ein paar Suchbegriffen zu finden ist (siehe oben) - ist keine Hexerei (Google, Stack Overflow, ... sind immer einen Blick wert!).

Viel Erfolg!

Edit:
Bevor ich das Programm gebastelt hatte, hab ich auch noch keine Erfahrung mit Verschlüsselung gehabt. Es kommt schon darauf an, dass man wirklich will und sich Mühe gibt...
 
H

hilfesuchend

Gast
Hallo nochmal,
habe mir mal ein Paar seiten durchgelesen und Arbeitskollegen gefragt. Auf dieser Grundlage habe ich mal etwas versucht:

Java:
import java.io.*;

public class TXTdatei 
{   
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException
    {
        File eingabe = new File ("C:\\Arbeit\\Beispieltext.txt");
        File ausgabe = new File ("C:\\Arbeit\\Beispieltext2.txt");
        
        
        try
        {
            System.out.println(eingabe);
            BufferedReader in = new BufferedReader(new FileReader(eingabe));
            String zeile = "";
            String neueZeile ="";
            int s = 0, c;
            FileWriter writer= new FileWriter(ausgabe);
            while((zeile = in.readLine()) != null)
            {
            	System.out.println(zeile);
            	
            	s = s%26;                                                            // s liegt zwischen 0 und 25
				
                for(int i =0; i<= zeile.length(); i++)
                {
                	c = zeile.charAt(i);                                             // Der Code des Buchstaben wird erzeugt
                	if (c< 64 & c <91)                                               // Alle Grossbuchstaben werden in Kleinbuchstaben umgewandelt
                	{
                		c = c + 32;
                	}
                	if (c <= 97 || c >122)                                           // "Nicht-Buchstaben" werden nicht verschluesselt
                	{
                		neueZeile = neueZeile + (char) (c);
                	}
                	else                                                             // Kleinbuchstabencodes werden um s verschoben und als Grossbuchstaben ausgegeben
                	{
                		neueZeile = neueZeile + (char) ((2 + s - 97) % 26 + 65);
                	}
                }
                writer.write(ausgabe + neueZeile);
            }
            writer.flush();
            writer.close();
        } 
        catch (Exception e) 
        {
            System.out.println("Fehler");
            e.printStackTrace();
        }
    } 
}


Leider klappt die ganze Sache vorne und hinten nicht ://
Könnt ihr mir vielleicht helfen, damit ich endlich mal eine Sinnvolle Lösung heraus bekomme?

Danke schonmal
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
mir deucht, der Code in meinem Link war auch von einem Fragestellenden, nicht besonders geeignet,
wirft kein gutes Licht auf mich, aber immer noch musst du dich fragen, ob du denn im Leben alleine zurecht kommst,
man kann auch weiter suchen, andere Codebeispiele

aufgrund meines Fehlers werde ich besonders mithelfen (falls ich nicht nur nerve, ruhig sagen ;) ),
bei dem geposteten Code aber kaum, den hast du doch nur kopiert und siehst eh nicht durch, oder?

vorerst versuche ich es noch mit Suchergebnissen, anscheinend gibts gar ein Video:
Chiffre: Vigenère-Beispiel - (Java 2-004) - YouTube
oder als Text vielleicht etwas respektabler:
encryption - Vigenère cipher in Java for all UTF-8 characters - Stack Overflow

wenn wir das hier diskutieren wollen musst du aber schon erst ein gewissen Verständnis entwickeln,
was passiert, wie wie der Ursprungstext durchlaufen, wie wird jeder char verändert, welche Spezialfälle wie Wertebereiche sind zu bedenken? (am Anfang ruhig ignorieren und dann erst im Fehlerfall ergänzen)

dass du aus Dateien lesen und schreiben kannst ist schön und gut, hier fürs Forum aber eher störend,
übe erstmal mit einem String "Test Text" oder so, auch den Key fest im Programm hinterlegen statt eintippen zu lassen,
später all das ergänzen sofern gewünscht, für den Test des Algorithmusses aber hinderlich
 
T

tröööt

Gast
einfacher RSA/AES hybrid

Java:
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class RSAHelper
{
	private InputStream in;
	private OutputStream out;
	private PrivateKey privateKey;
	private PublicKey publicKey;
	private Cipher privateCipher;
	private Cipher publicCipher;
	public RSAHelper(InputStream in, OutputStream out)
	{
		this.in=in;
		this.out=out;
	}
	public boolean generateKeyPair()
	{
		try
		{
			KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
			kpg.initialize(2048);
			KeyPair kp=kpg.generateKeyPair();
			privateKey=kp.getPrivate();
			publicKey=kp.getPublic();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean sendPublicKey()
	{
		try
		{
			ObjectOutputStream oos=new ObjectOutputStream(out);
			oos.writeObject(publicKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean receivePublicKey()
	{
		try
		{
			ObjectInputStream ois=new ObjectInputStream(in);
			publicKey=(PublicKey)ois.readObject();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean initCipher()
	{
		try
		{
			if(privateKey!=null)
			{
				privateCipher=Cipher.getInstance("RSA/ECB/PKCS1PADDING");
				privateCipher.init(Cipher.UNWRAP_MODE, privateKey);
			}
			publicCipher=Cipher.getInstance("RSA/ECB/PKCS1PADDING");
			publicCipher.init(Cipher.WRAP_MODE, publicKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean sendSecretKey(SecretKey secretKey)
	{
		try
		{
			byte[] wrappedKey=publicCipher.wrap(secretKey);
			out.write((wrappedKey.length>>4));
			out.write(wrappedKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public SecretKey receiveSecretKey()
	{
		try
		{
			int length=in.read();
			byte[] wrappedKey=new byte[(length<<4)];
			in.read(wrappedKey);
			return (SecretKey)privateCipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}
Java:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class AESHelper
{	
	private SecretKey key;
	private Cipher encryptCipher;
	private Cipher decryptCipher;
	public AESHelper(SecretKey key)
	{
		this.key=key;
	}
	public static SecretKey generateKey()
	{
		try
		{
			KeyGenerator keyGen=KeyGenerator.getInstance("AES");
			keyGen.init(128);
			return keyGen.generateKey();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public boolean initCipher()
	{
		try
		{
			IvParameterSpec iv=new IvParameterSpec(key.getEncoded());
			encryptCipher=Cipher.getInstance("AES/CBC/PKCS5PADDING");
			encryptCipher.init(Cipher.ENCRYPT_MODE, key, iv);
			decryptCipher=Cipher.getInstance("AES/CBC/PKCS5PADDING");
			decryptCipher.init(Cipher.DECRYPT_MODE, key, iv);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public byte[] encryptRAW(byte[] input)
	{
		try
		{
			return crypt(input, encryptCipher);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public String encryptString(String input)
	{
		byte[] rawinput=input.getBytes();
		byte[] rawoutput=encryptRAW(rawinput);
		if(rawoutput==null)
		{
			return null;
		}
		return binaryToHexString(rawoutput);
	}
	public byte[] decryptRAW(byte[] input)
	{
		try
		{
			return crypt(input, decryptCipher);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public String decryptString(String input)
	{
		byte[] rawinput=hexStringToBinary(input);
		byte[] rawoutput=decryptRAW(rawinput);
		if(rawoutput==null)
		{
			return null;
		}
		return new String(rawoutput);
	}
	private byte[] crypt(byte[] data, Cipher cipher) throws Exception
	{
		ByteArrayInputStream bais=new ByteArrayInputStream(data);
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		int blockSize=cipher.getBlockSize();
		int outputSize=cipher.getOutputSize(blockSize);
		byte[] input=new byte[blockSize];
		byte[] output=new byte[outputSize];
		int inLength=0;
		boolean finished=false;
		while(!finished)
		{
			inLength=bais.read(input);
			if(inLength==blockSize)
			{
				int outLength=cipher.update(input, 0, blockSize, output);
				baos.write(output, 0, outLength);
			}
			else
			{
				finished=true;
			}
		}
		if(inLength>0)
		{
			output=cipher.doFinal(input, 0, inLength);
		}
		else
		{
			output=cipher.doFinal();
		}
		baos.write(output);
		return baos.toByteArray();
	}
	private String binaryToHexString(byte[] input)
	{
		StringBuilder stringBuilder=new StringBuilder(input.length*2);
		for(byte b : input)
		{
			int i=b&0xFF;
			if(i<16)
			{
				stringBuilder.append("0");
			}
			stringBuilder.append(Integer.toHexString(i));
		}
		return stringBuilder.toString();
	}
	private byte[] hexStringToBinary(String input)
	{
		byte[] output=new byte[input.length()/2];
		for(int i=0; i<output.length; i++)
		{
			output[i]=(byte)Integer.parseInt(input.substring(i*2, (i*2)+2), 16);
		}
		return output;
	}
}

ist eigentlich für sicherung von client-server-com vorgesehen ... kann lokal aber auch mit PipedStreams arbeiten ... zur verwendung nutzt mal sufu
 
S

SlaterB

Gast
ob verständlicher Code/ Methoden a la Caesar/ Vignère, die man auch per Hand rechnen kann,
oder Aufruf obskurer Industrieverfahren, das muss man natürlich vorher grundsätzlich entscheiden

als Ausbildungsaufgabe ist RSA wohl nicht so spannend, wobei genauso Befehle zu suchen und viele Fehler möglich sind
 
T

tröööt

Gast
ach naja .. RSA kann man auch noch mit nem guten taschenrechner "per hand" rechnen ... muss man sich halt nur auf kleine schlüssel beschränken und eventuell jedes zeichen einzeln durchlaufen lassen wenn man keien sinnvollen gruppen bilden kann ... aber ich wollts nur mal so in den raum werfen ... genau so gut hätte man auch einfach "SSL" oder "TLS" sagen können ...
 
K

KellerBierNot

Gast
ob verständlicher Code/ Methoden a la Caesar/ Vignère, die man auch per Hand rechnen kann,
oder Aufruf obskurer Industrieverfahren

RSA ist kein obskures Industrie-Verfahren , sondern ein Standardverfahren aus der Public-Key Kryptografie in der man wunderbar per Hand den Schlüssel berechnen und ver- und entschlüsseln kann (Erweiterter Euklid Algorithmus sein dank). Das Verfahren an sich - ohne groß über die Zahlentheorie zu schwadronieren - kann man innerhalb von einer Stunde erlernen.

Ich halte es für einen Auszubildenden der noch nie was von Verschlüsselungen gehört hat aber auch für zu overpowered. Sollte aber ein gewisses Maß an Sicherheit in seiner Aufgabe eine Rolle spielen, dann wäre RSA eine sehr gute implementierbare Alternative zu Verfahren wie Vignère und Caesar, die noch aus einer Zeit stammen in der Verschlüsselungen noch Spielereien für Sprachwissenschaftler waren.
 
T

tröööt

Gast
grundsätzlich bedeutet "ver/entschlüsselung" doch nur das man aus einem klartext mit einem bestimmten verfahren einen ciphertext erzeugt (vice-versa) ...

und da ein "rechner" nun mal nur mit "0" und "1" "rechnet" lässt sich am ende alles auf mathematische operationen zurückführen ... (wobei ich substitution jetzt nicht gerade ein mathematisches verfahren nennen würde) ... ergo : es lassen sich alle modernen krypto-verfahren "per hand" rechnen ...

der unterschied ist nur das standardisierte algorithmen gute implementierungen haben die auch bei sehr großen zahlen noch performant sind ... während die variante "selbst rechnen" einfach nur zeit frisst und auf grund der beschränkten größen auch sehr anfällig ist ...

obskur würde ich rufen wenn jetzt was in richtung HMACwithRSAandSHA256 gekommen wäre ... wobei das auch "standard-verfahren" sind deren algorithmus offen liegt ...

security through obscurity ... also sicherheit durch unwissenheit ... funktioniert nicht ...

ergo : es ist deutlich besser bekannte und geprüfte algorithmen zu nutzen anstatt irgendwas in richtung cäsar-chiffre selbst basteln zu wollen ...

natürlich kann man cäsar auch in richtung enigma mit rotierenden multi-alphabeten und der bedingung input!=output deutlich sicherer machen ... aber die erfahrung hat uns doch mitlerweile gelehrt das dabei in der regel noch deutlich mehr fehler auftreten als einfach fertigen code zu nutzen der heutige standards einsetzt ... wobei natürlich der lernfaktor auch ne rolle spielt
 

Bleiglanz

Gesperrter Benutzer
Ich halte es für einen Auszubildenden der noch nie was von Verschlüsselungen gehört hat aber auch für zu overpowered. Sollte aber ein gewisses Maß an Sicherheit in seiner Aufgabe eine Rolle spielen, dann wäre RSA eine sehr gute implementierbare Alternative zu Verfahren wie Vignère und Caesar, die noch aus einer Zeit stammen in der Verschlüsselungen noch Spielereien für Sprachwissenschaftler waren.

Allerdings. Der OP sollte doch im zu Ausbildungszwecken lernen, wie man mit Textdateien und Streams umgeht und dazu 'Vignere' implementieren. Ich finde das eine gute Übung , man braucht doch nicht über Kryptographie und RSA reden, was soll das?

Nützlich wäre es eher gewesen, wenn man kurz erklärt hätte wie das funktionieren kann
Java:
DAS IST DER KLARTEXT, DER VERSCHLUESSELT WERDEN KANN...
GEHEIMWORTGEHEIMWORTGEHEIMWORTGEHEIMWORTGEHEIMWORT...
und dass man dann das erste "D" um "G" Stellen schieben muss, dass zweite "A" um "E" stellen schieben muss und das "S" umd "H" Stellen schieben muss usw.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
L Verschlüsseln mit bouncing castle Java Basics - Anfänger-Themen 1
I SHA512 verschlüsseln und dann wieder auslesen? Java Basics - Anfänger-Themen 35
T String simpel aber sicher verschlüsseln Java Basics - Anfänger-Themen 5
U Passwort verschlüsseln schlägt fehl Java Basics - Anfänger-Themen 3
L Text verschlüsseln Java Basics - Anfänger-Themen 13
S Strings verschlüsseln und entschlüsseln?! Java Basics - Anfänger-Themen 6
O Java Dateien verschlüsseln? Java Basics - Anfänger-Themen 22
B String verschlüsseln - Applet - ohne BASE64 Java Basics - Anfänger-Themen 7
R Server-Daten sichern/verschlüsseln Java Basics - Anfänger-Themen 10
P Sensible Daten Speichern/Verschlüsseln von serialisiertem Objekt Java Basics - Anfänger-Themen 5
-horn- Java-Bytecode und Outputs verschlüsseln? Java Basics - Anfänger-Themen 3
E Verschlüsseln und FileWrite Java Basics - Anfänger-Themen 6
S String mit Hilfe von Array verschlüsseln Java Basics - Anfänger-Themen 19
F Algorithm zum Verschlüsseln und Entschlüsseln Java Basics - Anfänger-Themen 6
S Nummern verschlüsseln, prüfen ob vorhanden in Datenbank Java Basics - Anfänger-Themen 2
B Strings verschlüsseln Java Basics - Anfänger-Themen 6
H verschlüsseln von daten Java Basics - Anfänger-Themen 2
D daten verschlüsseln Java Basics - Anfänger-Themen 4
D Passwort verschlüsseln mit MD5 Java Basics - Anfänger-Themen 30
A MD5 verschlüsseln Java Basics - Anfänger-Themen 3
A DSA und Base64 Verschlüsseln und Entschlüsseln Java Basics - Anfänger-Themen 4
S "Verschlüsseln" anderer Dateien! Java Basics - Anfänger-Themen 19
L Datei verschlüsseln Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben