# Verschlüsselung von Strings



## Bongi (9. Januar 2008)

Hallo zusammen,

ich habe ein kleines Problem: Ich muss 2 Möglichkeiten finden, einen String zu verschlüsseln. Dies darf ich leider nicht mit den vorhandenen Bibliotheken machen. Dafür werden keine Anforderungen an die tatsächliche Sicherheit gestellt. Ich hab mir nach einiger Recherche den Caesar Sypher ausgesucht. Der macht bei mir auch was er soll... jedenfalls so großteilig... manchmal kommen völlig wirre Ergebnisse. Wo liegt der Fehler in meinem Code? (die Variable key gibt dabei die Verschiebung an, also bei 3 wird aus a ein d usw., die Variable value ist für den String reserviert).

Verschlüsselung:


```
public String enCrypt(String value, int key) {
		String edited = value;
		StringBuffer ergebnis = new StringBuffer();

	    for( int i = 0; i < edited.length(); i++ )
	    {
	      int c = edited.charAt( i );

	      if ( (c >= 'A') && (c <= 'z') ) {
	        c += key;
	        if( c > 'z' )
	          c = 'a' + c % 'z' -1;
	        if( (c > 'Z') && (c < 'a') ) 
	          c = 'A' + c % 'Z' - 1;
	      }
	      ergebnis.append( (char) c );
	    }
		return ergebnis.toString();
	}
```

Entschlüsselung:


```
public String deCrypt(String value, int key) {
		
		String edited = value;
		StringBuffer ergebnis = new StringBuffer();
	    
	    for( int i = 0; i < edited.length(); i++ )
	    {
	      int c = edited.charAt( i );

	      if ( (c >= 'A') && (c <= 'z') ) {
	        c -= key;
	        if( (c < 'a') && (c > 'Z') )
	          c = 'a' + ('z' - c % 'a') - 1;
	        if( c < 'A' )
	          c = 'A' + ('Z' - c % 'A') - 1;
	      }
	      ergebnis.append( (char) c );
	    }
	    return ergebnis.toString();
	}
```

Desweiteren brauche ich eine einfache Verschlüsselung mit Passwort. Ich habe schon mit XOR rumgespielt, aber da kriege ich die toString() Funktion am Ende nicht hin. Ich brauche im Prinzip nur einen Ver- und Entschlüsselungs-Algorhythmus, der irgendwie ein Passwort mit einbindet. Jemand ne Idee?

Im Vorraus schon mal vielen Dank 

Grüsse, Bongi

P.S: Noch mal zur Klarheit: Der Nutzer soll einen String eingeben können, erhält daraufhin wieder einen String zurück welchen er wieder eingeben kann und quasi "zurückübersetzen" lassen kann... im 2. Fall halt mit einem einfach Passwort.


----------



## fjfvo (13. Januar 2008)

Hallo,

schau mal hier, habe getestet mit Eingabe: abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ



```
package textcoding;

public class Coder {

	public String enCrypt(String text, int key) {
		StringBuffer ergebnis = new StringBuffer();
		key %= 26;
		for (int i = 0; i < text.length(); i++) {
			int min = 65, max = 90;
			int c = text.charAt(i);
			if ((c < 'A') || (c > 'z') || (c > 'Z') && (c < 'a')) {
				ergebnis.append((char) c);
				continue;
			}
			if (c > max) {
				min += 32;
				max += 32;
			}
			int cc = c + key;
			if (cc > max)
				c = cc - 26;
			else
				c = cc;
			ergebnis.append((char) c);
		}
		return ergebnis.toString();
	}

	public String deCrypt(String text, int key) {
		StringBuffer ergebnis = new StringBuffer();
		key %= 26;
		for (int i = 0; i < text.length(); i++) {
			int min = 65, max = 90;
			int c = text.charAt(i);
			if ((c < 'A') || (c > 'z') || (c > 'Z') && (c < 'a')) {
				ergebnis.append((char) c);
				continue;
			}
			if (c > max) {
				min += 32;
				max += 32;
			}
			int cc = c - key;
			if (cc < min)
				c = cc + 26;
			else
				c = cc;
			ergebnis.append((char) c);
		}
		return ergebnis.toString();
	}

	public static void main(String[] args) {
		if (args.length < 3) {
			System.out.println("Give arguments: 1: e or d for encode or decode and");
			System.out.println("2: the string to en/decode");
			System.out.println("3: the key neede to en/decode");
			System.exit(0);
		}
		char what = args[0].charAt(0);
		String text = args[1];
		int key = Integer.parseInt(args[2]);
		Coder coder = new Coder();
		if (what == 'e') {
			String encoded = coder.enCrypt(text, key);
			System.out.println(encoded);
			System.out.println(coder.deCrypt(encoded, key));
		}
	}
}
```


----------



## fjfvo (13. Januar 2008)

Hallo,

enCrypt und deCrypt sind ziemlich ähnlich; duplicaten Kode sollte man vermeiden via refactoring. Eigentlich ist deCrypt gleich enCrypt mit anderem Schlüssel.


```
public String deCrypt(String text, int key) {
		return enCrypt(text,26-key);
	}
```

So früh wie möglich testen ist wichtig. Ein Ansatz:


```
package textcoding;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class CodingTest {
    private Coder coder;
	
	@Before
	public void setUp() throws Exception {
		coder = new Coder();
	}

	@After
	public void tearDown() throws Exception {
		coder = null;
	}
	
	@Test
	public void testEncoding() {
		assertEquals("def",coder.enCrypt("abc", 3));
		assertEquals("abc",coder.enCrypt("xyz", 3));
		assertEquals("pqRU",coder.enCrypt("abCF", 15));
		assertEquals("def",coder.enCrypt("abc", 29));
	}

	@Test
	public void testDecoding() {
		assertEquals("abc",coder.deCrypt("def", 3));
		assertEquals("xyz",coder.deCrypt("abc", 3));
		assertEquals("ab CF",coder.deCrypt("pq RU", 15));
		assertEquals("-^;CF",coder.deCrypt("-^;RU", 41));
	}
}
```

(Sind negative Schlüssel erlaubt?)


----------

