AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Entschlüsselung von D7 auf D10.2 Tokyo portieren

Ein Thema von Poelser · begonnen am 8. Okt 2020 · letzter Beitrag vom 9. Okt 2020
Antwort Antwort
Poelser
Online

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#1

Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 07:50
Moin zusammen!

Ich habe einen Teil einer alten Anwendung in D7 auf D10.2 Tokyo zu portieren. Dabei geht es, den alten Sourcen nach, um eine AES-Verschlüsselung nach Rijndael. Genaueres steht da leider nicht drin, der ursprüngliche Entwickler kann nicht mehr befragt werden.
Diesen Teil habe ich erfolgreich nach Lazarus 2.0.10 portiert. Damit kann ich Strings, die aus einer DB kommen, entschlüsseln. Aber dieser Mechanismus von Lazarus nach Tokyo portiert funzt nicht .

Das ist gegeben:
Delphi-Quellcode:
const
  LocalCryptval=12345;
type
  Str2=String[2];
Jetzt kommt hier noch einiges an Funktionen, u.a. auch Assembler-Code. Wie gesagt - mit Lazarus funktioniert es, aber
Delphi-Quellcode:
class function TTools_Crypt.HexToByte(b: Str2): Byte;
begin
  while Length(b)<2 do b:='0'+b;
  Result:=HexToNibble(b[1]) shl 4 + HexToNibble(b[2]);
end;

class function TTools_Crypt.HexToNibble(n: Char): Byte;
const
  HexNib: Array[0..$F] of Char=
    ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
var
  i: Byte;
begin
 Result:=0;
 for i:=0 to $F do
   if UpCase(n)=HexNib[i] then Result:=i;
end;
compiliert und funktioniert in Lazarus einwandfrei. Delphi aber meckert hier

[dcc32 Fehler] Tools.pas(281): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'

für b[1] und b[2]. Mache ich einen Typecast
  Result:=HexToNibble(char(b[1])) shl 4 + HexToNibble(Char(b[2])); compiliert das zwar, die Entschlüsselung liefert dann aber ein falsches Ergebnis (irgendwelche chinesischen Zeichen) zurück.

Wie setze ich das dann richtig um, damit auch Delphi das korrekt macht?

LG aus dem Norden, Edmund
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 08:08
Shortstrings sind AnsiChar.

Delphi-Quellcode:
class function TTools_Crypt.HexToNibble(n: AnsiChar): Byte;
const
  HexNib: Array[0..$F] of AnsiChar=...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.098 Beiträge
 
Delphi 12 Athens
 
#3

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 08:20
Jupp, mit Delphi 2009 wurden Char, PChar und String aus Unicode geändert.
Der Typ String[x] und ShortString war und ist weiterhin ein ShortString (ein Record aus AnsiChars mit Längenbyte im Char[0]) ... im/bis Delphi 1 war das mal der Typ "String".

Bei Lazarus/FreePascal mußt du dagegen aufpassen, denn dort sind die verwendeten String-Typen teilweise UTF-8.
Mit AnsiChar/PAnsiChar/AnsiString sollte aber in Lararus und Delphi hier kein Problem geben.


PS: Sowas ist auch der Grund, warum man keine dynamischen Typen und Funktionen verwenden sollte, wenn es um "externe" Daten geht.
Char/PChar/String hängen vom Compiler ab. Früher hing auch mal Integer/Cardinal davon ab, aber bei 64 Bit wurden die eingefroren und jetzt heißt der compilerabhängige Typ im Delphi NativeInt und NativeUInt.


Ach ja, das Suchen in HexToNibble ist etwas ... naja.
Das kann man auch ohne Schleife machen, entweder matematisch (Zuffern und Buchstaben sind jeweils in fortlaufenden Bereichen)
oder über Maps. (siehe B2HConvert und H2BConvert in System.Classes)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Okt 2020 um 08:24 Uhr)
  Mit Zitat antworten Zitat
Poelser
Online

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 08:30
Danke,

Shortstrings sind AnsiChar.

Delphi-Quellcode:
class function TTools_Crypt.HexToNibble(n: AnsiChar): Byte;
const
  HexNib: Array[0..$F] of AnsiChar=...
das compiliert jetzt mit Tokyo und Lazarus identisch, allerdings ist die Entschlüsselung mit Tokyo noch nicht korrekt. Aber das kann durchaus noch eine andere Ursache haben, schau'n mer mal...

LG aus dem Norden, Edmund
  Mit Zitat antworten Zitat
Poelser
Online

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 15:52
Funktioniert zwar immer noch nicht, aber ich bin ja nun einen Schritt weiter. Die Umstellung auf AnsiChar funktioniert jetzt mit Tokyo und Lazarus identisch.

Was nicht funktioniert, ist diese Funktion:
Delphi-Quellcode:
class procedure TTools_Crypt.CryptByte(var aByte: Byte; var CV: Word);
var
  rBX, rDX: Word;
  i: Byte;
  rBL: Byte absolute rBX;
begin
  rBX:=CV;
  for i:=1 to 8 do
  begin
    rDX:=rBX;
    rDX:=rDX shl 1;
    asm
      mov AX, rDX
      shr AL, 1
      xor AL, AH
      mov rDX, AX
    end;
    rBX:=rBX shl 1;
    asm
      mov AX, rDX
      rcr AX, 1
      mov rDX, AX
      mov AX, rBX
      rcr AX, 1
      mov rBX, AX
    end;
    rBX:=rBX shr 1;
  end;
  aByte:=aByte xor rBL;
  CV:=rBX;
end;
Vorher wird mit all den anderen Funktionen ein (verschlüsselter) String in einen Puffer geschrieben. In diesem Puffer wird Byte für Byte entschlüsselt, in CV kommt der Schlüssel rein (das was in Const Cryptval steht). Dieser Puffer wird anschliessend in den String zurückgeschrieben.

Nur zur Erinnerung: Ursprünglich funktioniert das mit D7, und auch im aktuellen Lazarus kein Problem (Lazarus braucht zusätzlich nur {$ASMMODE intel}).

Aber in Tokyo kann ich im Debugger sehen, dass im Puffer was anderes erzeugt wird, und dieser falsche Kram landet im String.

Damit ergibt sich die Frage, warum verhält sich Tokyo hier anders als Lazarus und D7?
Was muss ich ändern, gibt es hier vielleicht noch einen Compilerschalter, den mir Google nicht rausrückt? Ich verstehe von Intel-Assembler leider zu wenig
Oder gibt's in Tokyo hier 'nen Bug?

Geändert von Poelser ( 8. Okt 2020 um 16:06 Uhr) Grund: Hatte übersehen, das kann ja auch noch sein
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.753 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 8. Okt 2020, 18:05
.. hast Du Deine String Parameter auch in AnsiString umbenamst?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Poelser
Online

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Entschlüsselung von D7 auf D10.2 Tokyo portieren

  Alt 9. Okt 2020, 07:39
.. hast Du Deine String Parameter auch in AnsiString umbenamst?
Danke, das war der entscheidende Hinweis!

Die Firebird-DB ist mit ISO 8859-1 kodiert, nicht mit UTF8 oder so. Die gecrypteten Felder lese ich nun mit Ansistring(myCryptedFieldStr), und schon geht's!

LG aus dem Norden, Edmund
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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