Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kodierungsproblem von Delphi zu Java (https://www.delphipraxis.net/162278-kodierungsproblem-von-delphi-zu-java.html)

athomas 15. Aug 2011 22:57

Kodierungsproblem von Delphi zu Java
 
Hallo,
ich habe folgendes Problem: ich habe ein verschlüsselungsprogramm in delphi geschrieben und will nun auf diesen verschlüsselten text von java zugreifen.
der algorithmus sieht so aus:
Code:
function coder(s, key: string; decode: boolean): string;
var
  i, z: integer;
begin
  if key<>'' then
    begin
      for i:=1 to length(s) do
        begin
          if not(decode) then
            begin
              z:=ord(s[i]);
              z:=z+ord(key[i mod length(key) + 1]);
              s[i]:=chr(z);
            end
          else
            begin
              z:=ord(s[i]);
              z:=z-ord(key[i mod length(key) + 1]);
              s[i]:=chr(z);
            end;
        end;
    end;
  result:=s;
end;
aber wenn ich ihn in java überführe habe ich probleme mit dem unicode, also bin ich auf byte[] ausgewichen, aber der text ist nicht mehr entschlüsselbar :( könnt ihr mir vllt helfen??
schonmal vielen dank :) gruß thomas
hier der java code:
Code:
private String coder(String sr, boolean decode) {
        int[] code = new int[sr.length()];
        try {
        byte[] key = "faselblubberbla".getBytes("ASCII");
        byte[] s = sr.getBytes("ASCII");

        int count = 0;
        if (key != null && key.length > 0) {
            int z = 0;
            for (int i = 1; i < s.length; i++) {
                int delta = key[(i+1) % key.length];
                if (!decode) {
                    z = s[i];
                    z = mod(z + delta, 128);
                    code[count] = z;
                } else {
                    z = s[i];
                    z = mod(z - delta, 128);
                    code[count] = z;
                }

                count++;
            }
        }

        System.out.println(new Character((char) s[0]).toString() +" "+ s[0]);
        System.out.println(new Character((char) key[0]).toString() +" "+ key[0]);
        System.out.println(new Character((char) code[0]).toString() +" "+ code[0]);

        } catch (UnsupportedEncodingException e) {
           
        }

        String str = "";
        for (int i = 0; i < sr.length(); i++) {
            str += new Character((char) code[i]);
        }
        return str;
    }

gammatester 16. Aug 2011 07:47

AW: Kodierungsproblem von Delphi zu Java
 
Das normale Unicode-Desaster hast Du bereits ausgeschlossen? Welche Delphi-Version benutzt Du? Sind Unicodeastrings default?

Du solltest auf jeden Fall alle Strings in Delphi ansistring machen. Außerdem kann es Probleme geben, wenn Addition und Subtraktion der Schlüsselbytes den Berecih 0..255 verlassen, also auf beiden Seiten (Delphi und Java) sicherheitshalber schreiben
Delphi-Quellcode:
s[i]:=chr(z and $FF);
und nicht mod 128 in Java (bzw. auch in Delphi schreiben
Delphi-Quellcode:
s[i]:=chr(z and $7F);
(Dann darfst Du Dich allerdings nicht wundern, wenn zB "Nö, dös göht nicht!" nach dem Ent/Verschlüssel nicht mehr hergestellt werden kann!)

Wenn man das alles sieht, fragt man sich wieder einmal, warum immer wieder Leute auf die Idee kommen, unbedingt mit Strings/Chars rechnen zu wollen?!

athomas 16. Aug 2011 10:17

AW: Kodierungsproblem von Delphi zu Java
 
hallo, schonmal danke für die antwort,
das modulo 128 iss nicht das Problem, hab auch schon vorher modulo 256 probiert..

ich verwende Delphi 5.
Das Problem ist ja nicht, dass mein Delphi Programm was macht was nicht funktioniert, sondern da klappt das Ver- und Entschlüsseln einwandfrei.
Aber wenn ich den verschlüsselten String in Java dekodieren will, funktioniert das nicht.

Vllt rechnet Delphi ja anders mit Strings und Chars als Java, wenn ja, wie rechnet Delphi?

gruß thomas

gammatester 16. Aug 2011 11:13

AW: Kodierungsproblem von Delphi zu Java
 
Dann scheint mir ein kritscher Teil im Javacode zu sein:
Code:
z = mod(z - delta, 128);
Da delta ja auch einmal größer als z sein kann, ist das Ergebnis dann wohl negativ. Versuch doch mal
Code:
z = (z - delta) & 255;
(Auf aus Delphiseite würde ein chr(z and 255) die Klarkeit verbessern.)

Ansonsten ist es sinnvoll, einmal alle einzelnen Zeichen vor und nach der Kodierung dezimal oder hex auszugeben; dann sollte relativ schnell erkennbar sein, was schiefläuft.

Bernhard Geyer 16. Aug 2011 12:07

AW: Kodierungsproblem von Delphi zu Java
 
Java-Strings sind immer Widestrings (UTF16). D.h hier hast du schon Probleme zum Delphi-Ansi-String.
Du müsstest in Java den String mittels getBytes dir als ByteArray zurückgeben lassen (Charset "ISO-8859-1" mal probieren) und dann das ByteArray codieren.

athomas 16. Aug 2011 12:16

AW: Kodierungsproblem von Delphi zu Java
 
hab jetzt ein problem lokalisiert:
die getBytes-Methode liefert mir ne Zeichenkette die nur Fargezeichen enthält ^^
und wie könnte ich das jetzt richtig in ASCII-Code konvertieren?
"ASCII"- und "ISO-8859-1"-Charset machen beide das gleiche..

zumindest bei dem key funktioniert die Methode, nur bei dem Text nicht

gruß thomas

rollstuhlfahrer 16. Aug 2011 12:30

AW: Kodierungsproblem von Delphi zu Java
 
Und wie sieht es aus, wenn du Delphi-seitig schon mal auf WideStrings wechselst?

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz