@ ALLE PROFIS:
Habe ein Problem mit einem Verschlüsselungsprogramm. Das Kuriose ist, mit einem Selbst erzeugten Schlüssel (per RandomAccess) und einem Text ohne mehrer Absätze und ohne Sonderzeichen funktioniert die Sache. Habe jetzt versucht alles UTF8 konform zu machen, aber ohne gutes Ergebnis. Scheint beim speichern oder Öffnen Probs zu geben.
Folgender Code
Class Editor:
und Class Codierer:
Wär echt toll wenn da jemand nen Tipp hätte!
PS der Offset ist hier auf 0 gesetzt und erstmal nicht relevant!
Habe ein Problem mit einem Verschlüsselungsprogramm. Das Kuriose ist, mit einem Selbst erzeugten Schlüssel (per RandomAccess) und einem Text ohne mehrer Absätze und ohne Sonderzeichen funktioniert die Sache. Habe jetzt versucht alles UTF8 konform zu machen, aber ohne gutes Ergebnis. Scheint beim speichern oder Öffnen Probs zu geben.
Folgender Code
Class Editor:
Code:
void doSaveCommand() {
FileDialog file = new FileDialog(TextEditor2.this, "Save File",
FileDialog.SAVE);
file.setVisible(true);
String currentFile;
if ((currentFile = file.getFile()) != null) {
String filename = file.getDirectory() + currentFile;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
File f = new File(filename);
try{
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
w.write(pane.getText());
w.close();
}
catch(Exception e){
System.err.print("Fehler beim Speichern: "+e);
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
void doSaveKeyCommand(String key) {
FileDialog file = new FileDialog(TextEditor2.this, "Save KeyFile",
FileDialog.SAVE);
file.setVisible(true);
String currentFile;
if ((currentFile = file.getFile()) != null) {
String filename = file.getDirectory() + currentFile;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
File f = new File(filename);
try{
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
Codierer co = new Codierer();
key = co.byteUtfShit(key);
w.write(key);
w.close();
}
catch(Exception e){
System.err.print("Fehler beim Speichern: "+e);
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
void doOpenCommand() {
pane.setText("");
FileDialog file = new FileDialog(TextEditor2.this, "Open File",
FileDialog.LOAD);
file.setFile("*.java;*.txt"); // Set initial filename filter
file.setVisible(true);
String currentFile;
if ((currentFile = file.getFile()) != null) {
String filename = file.getDirectory() + currentFile;
// char[] data;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// File f = new File (filename);
String line;
String line2 = "";
String lineKey="";
try {
RandomAccessFile ra = new RandomAccessFile(filename, "r");
while ( (line=ra.readLine()) != null )
{
line2 = line2+line+"\n";
lineKey = lineKey+line;
}
Codierer co = new Codierer();
line2 = co.byteUtfShit(line2);
pane.setText(line2);
this.lineKey = lineKey;
} catch (Exception e) {
System.err.print("Fehler beim öffenen (IO):" + e);
} //catch(FileNotFoundException e){}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
void doOpenKeyCommand()
{
FileDialog file = new FileDialog(TextEditor2.this, "Open a Keyfile",
FileDialog.LOAD);
file.setFile("*.*"); // Set initial filename filter
file.setVisible(true);
String currentFile;
if ((currentFile = file.getFile()) != null) {
String filename = file.getDirectory() + currentFile;
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
String line;
String line2 = "";
try {
RandomAccessFile ra = new RandomAccessFile(filename, "r");
while ( (line=ra.readLine()) != null )
line2 = line2+line+"\n";
Codierer co = new Codierer();
line2 = co.byteUtfShit(line2);
keydata = line2;
} catch (Exception e) {
System.err.print("Fehler beim öffenen (IO):" + e);
} //catch(FileNotFoundException e){}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
private void doMakeKey()
{
//text an codierer übergeben (für die länge des Keys)
//soll den Key unter einer Datei nach wahl des Users spiechern.
int z1, z2 = 0;
Codierer co = new Codierer();
this.lineKey = pane.getText();
while(z2 < 2)
z2 = co.random(9);
z1 = z2 * /*pane.getText()*/this.lineKey.length();
String key = co.makeKey(z1);
keydata = key;
doSaveKeyCommand(key);
}
private void doCryptTextCommand()
{
if (keydata == null)
{
JOptionPane.showMessageDialog(null, "Sie haben noch keinen Schlüssel erstellt!","FEHLER", JOptionPane.WARNING_MESSAGE );
}
else
{
//Hier die Übergaben an die verschlüsselung !!! Der Offset wird in der verschlüsselten Date gespeichert!
// keydata
// pane.getText();
Codierer co = new Codierer();
this.lineKey = pane.getText();
pane.setText(co.codiere(this.lineKey, this.keydata));
this.lineKey = pane.getText();
JOptionPane.showMessageDialog(null, "Verschlüsselung war erfolgreich","Bestätigung", JOptionPane.INFORMATION_MESSAGE );
}
}
private void doEncryptTextCommand()
{
if (keydata == null)
{
JOptionPane.showMessageDialog(null, "Sie haben noch keinen Schlüssel geladen!","FEHLER", JOptionPane.WARNING_MESSAGE );
}
else
{
//Der verschlüsselte Text befindet sich in pane, der key sollte geladen sein!
// keydata
// pane.getText();
Codierer co = new Codierer();
//this.lineKey = pane.getText();
//pane.setText(co.deCodiere(/*pane.getText()*/this.lineKey, keydata));
String text = (co.deCodiere(/*pane.getText()*/this.lineKey, keydata));
//Text um die Hinterste Stelle schneiden um den Offset wegzu bekommen:
text = text.substring(0, text.length()-1);
pane.setText(text);
JOptionPane.showMessageDialog(null, "Entschlüsselung war erfolgreich","Bestätigung", JOptionPane.INFORMATION_MESSAGE );
}
}
und Class Codierer:
Code:
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import java.util.Random;
import javax.swing.JOptionPane;
/**
* @author Trax
*
*/
public class Codierer {
/**
* Codiert zwei int Arrays !!!
* @param text
* @param key
* @return
*/
public String codiere(String text, String key)
{
Codierer co = new Codierer();
text = co.byteUtfShit(text);
//key = co.byteUtfShit(key);
System.out.println("TEXT: "+text);
int[] texti = strIntToInteger(text);
int[] keyi = strIntToInteger(key);
int offset;
//Offsetwert einbauen (zwischen 0 und text.length), da der Key ja immer mindestens 2* length ist!!!
if(text.length() >= key.length())
offset = 0;
else
offset = 0;
//offset = random(text.length()/2);
JOptionPane.showMessageDialog(null, "OffSet Wert: "+offset,"Bestätigung", JOptionPane.INFORMATION_MESSAGE );
for(int i = 0; i<texti.length; i++)
{
texti[i]^=keyi[i+offset];
//System.out.println("i: "+i+", +offset: = "+offset+i);
}
text = parseBack(texti);
System.out.println("Offset: "+(char)offset);
return(text+(char)offset);
}
public String deCodiere(String text, String key)
{
int[] texti = strIntToInteger(text);
int[] keyi = strIntToInteger(key);
// auslesen des Offsets, parsen in int:
int offset = (int)text.charAt(text.length()-1);
System.out.println("Der offset im deCodierer: "+offset);
for(int i = 0; i< texti.length; i++)
{
texti[i]^=keyi[i+offset];
}
//der offset muss noch aus dem Ergebnis geschnitten werden!!!
text = parseBack(texti);
return(text);
}
public String byteUtfShit(String text)
{
try {
return (new String(text.getBytes(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return text;
}
}
/**
* erstellt einen beliebig langen Schlüssel nach secureRandom
* @param laenge ist die länge des zu erstellenden Keys
* @return
*/
public String makeKey(int laenge)
{
SecureRandom sc = new SecureRandom();
String strKey = "";
for (int i = 0; i <= laenge; i++)
{
int key = sc.nextInt(10);
strKey = strKey+(char)key;
}
System.out.println("Key: "+strKey);
return strKey;
}
public int random(int max)
{
Random rand = new Random();
return(rand.nextInt(max));
}
/**
* Wandelt einen Schlüssel bestehend aus Zeichen um in Int[]
* @return
*/
public int[] strIntToInteger(String key)
{
int[] ret2 = new int[key.length()];
for (int i = 0; i < key.length(); i++)
{
ret2[i] = (int)key.charAt(i);
}
return ret2;
}
Wär echt toll wenn da jemand nen Tipp hätte!
PS der Offset ist hier auf 0 gesetzt und erstmal nicht relevant!