# In Java verschlüsseln - mit C# entschlüsseln



## Benne (31. Jul 2007)

Hallo!
Ich weiß es ist ein Java-Forum, aber vielleicht habe ich ja Glück hier Leute zu treffen die zusätzlich auch in .NET programmieren.
Und zwar verschlüssele ich einige Strings um sie anschließend in eine SQLite DB zu schreiben. Eingelesen werden die Daten dann auf einem mobilen Gerät.

So verschlüssele ich in JAVA (DES):


```
Key key = new SecretKeySpec( "01234567".getBytes(), "DES" );
this.cipher = Cipher.getInstance("DES");
this.cipher.init(Cipher.ENCRYPT_MODE, key);
String encrypted= encrypt("hallo Welt");


public String encrypt(String text){
    	String result ="";
    	try {
			result =  Base64.encode(this.cipher.doFinal(text.getBytes()));
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
    }
```

Als Ergebnis erhält man für "hallo Welt" den verschlüsselten String "AtOUWKorPTDcSwhOxqNvyw=="

Allerdings bekomme ich diesen String einfach nicht entschlüsselt
Mein Ansatz war erstmal die Base64 zu wiederrufen:

```
byte[] decbuff = Convert.FromBase64String("AtOUWKorPTDcSwhOxqNvyw==");
            String base64encoded = System.Text.Encoding.UTF8.GetString(decbuff, 0, decbuff.Length);
```
um dann

```
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = Encoding.UTF8.GetBytes("01234567");
            ICryptoTransform decrypter = des.CreateDecryptor();
```
 An dieser Stelle komme ich aber nicht weiter. 
Für des.CreateDecryptor() gibt es auch eine überschriebene Funktion, die einen Schlüssel und den Initialisierungsvektor erwartet. Wenn ich mir in Java aber den IV ansehen will bekomme ich nur ein "null"...

Habe kein vernünftiges Beispiel gefunden. Wenn Ihr mit nen Tipp geben könntet wäre ich sehr dankbar. Die Verschlüsselungsart ist mir egal.
Bis denne
Benne


----------



## SlaterB (31. Jul 2007)

allgemein gesprochen: kannst du überhaupt in C# entschlüsseln und verschlüsseln?

verschlüssle in C# den gleichen String mit dem gleichen Schlüssel und vergleiche diesen verschlüsselten Text mit dem von Java eingelesenen,
gleichen die sich in jedem Zeichen oder nicht?

wenn sie sich gleichen, klappt dann die Entschlüsselung des C#-Strings, aber nicht die des Java-Strings?


----------



## Benne (31. Jul 2007)

also ich habe mich auf der .NET Seite jetzt an diesem Beispiel entlang gehangelt:
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.rc2cryptoserviceprovider(VS.71).aspx
Anstelle von RC2 habe ich aber (erstmal) DES genommen. Innerhalb von .NET funktioniert die Ver- und Entschlüsselung auch soweit gut. Leider sind die verschlüsselten Codes nicht gleich. Dies liegt wohl daran, dass ich in der Java-Funktionen keinen Initialisierungsvektor angeben kann und .NEt mit null als IV nichts anfangen kann.


----------



## deleted (31. Jul 2007)

Verschlüsselung ist eine Sache von Mathematik und nicht von Programmiersprache.
Vielleicht nutzt du halt Methoden, die anders implementiert sind.
z.B. wegen unterschiedlichem Zeichensatz etc.


----------



## Benne (1. Aug 2007)

als ich kann mir ja nicht vorstellen, dass ein DES oder AES Algorithmus unterschiedlich implementiert werden kann. Das mit dem Zeichensatz ist nochmal ne gute Idee. Da werde ich mir nochmal was überlegen.
Oder kennt jemande eine andere (narrensichere) Art und Weise Texte zu verschlüsseln und wieder zu entschlüsseln. Ich habe auch noch das Problem, dass die Werte in eine DAtenbank geschrieben werden müssen und da dann natürlich keine Hochkommata vorkommen dürfen. Bei Umwandlung in Base64 konnte ich zwar speichern aber die Umlaute gingen mir verloren.


----------



## Claude (4. Okt 2007)

Ich hab das selbe problem mit Java und Delphi. Ich will AES verschlüsseln aber null als IV geht auch nicht. Wobei ich auch sonst nicht so recht weiss wie ich was einstellen muss. Eine narrensichere Methode wär mir auch recht selbst wenn sie nicht so sicher ist. es geht nur darum dass nicht jeder die Datei anschauen kann.


----------



## Guest (4. Okt 2007)

Claude hat gesagt.:
			
		

> Eine narrensichere Methode wär mir auch recht selbst wenn sie nicht so sicher ist. es geht nur darum dass nicht jeder die Datei anschauen kann.



In diesem Fall wäre es doch das beste sich einen Verschlüsselungsalgorithmus selber zu schreiben. Auf diese Art kannst Du das entschlüsseln unabhängig auf jeder Maschine selber aufbauen. Da Du weit wie das ganze verschlüsselt ist kannst Du die Entschlüsselungsroutinen ja entsprechend auf jeder Maschine anpassen.


----------



## HoaX (4. Okt 2007)

fragt sich nur wie sicher die verschlüsselung dann ist 

noch ein paar denkanstöße:
a)du verwendest in .NET immer Encoding.UTF8..., also solltest du in java auch text.getBytes("UTF8") verwenden.

b)sind denn nach dem base64 decode die daten noch die selben?

c)evtl wird auch an anderer chaining-modus verwendet?

d) mal den IV in java angegeben statt null?



			
				Benne hat gesagt.:
			
		

> Ich habe auch noch das Problem, dass die Werte in eine DAtenbank geschrieben werden müssen und da dann natürlich keine Hochkommata vorkommen dürfen. Bei Umwandlung in Base64 konnte ich zwar speichern aber die Umlaute gingen mir verloren.



wenn du binärdaten hast verwende ein blob in der datenbank.

wenn du ein PreparedStatement verwendest kann dein string auch getrost hochkommata enthalten.

wenn du trotz base64 kaputte umlaute hast, dann hast du definitiv ein problem mit den zeichensätzen


----------

