Obwohl
Delphi-Quellcode:
function Chr ( IntValue : Integer ) : AnsiChar;
function Chr ( IntValue : Integer ) : WideChar;
sein soll, bekomme ich in Turbo Delphi bei
Delphi-Quellcode:
for i := 1 to Length(S) do
S[i] := Chr((Ord(S[i]) shl 8) or (Ord(S[i]) shr 8));
die Meldung
Code:
[Pascal Fehler]E2010 Inkompatible Typen: 'WideChar' und 'Char'
Nachtrag: Mit WideChar anstelle Chr geht es. Aber das Passwort ist dann immernoch ungültig.
___
Die Codepage bezieht sich auf den Ausgangsstring und so bekomme ich bei 1200 und 1201 eine Länge von 0.
___
In der D2010-Komponente, welche ich zu Hilfe genommen habe, wird String verwendet und bei der Ermittlung des MD5 Hash wird in der
unit DCPcrypt2 UpdateStr aufgerufen, welche so deklariert ist:
Delphi-Quellcode:
procedure UpdateStr(
const Str: AnsiString);
{$IFDEF UNICODE}overload;
{$ENDIF}
{ Update the hash buffer with the string }
{$IFDEF UNICODE}
procedure UpdateStr(
const Str: UnicodeString);
overload;
{ Update the hash buffer with the string }
{$ENDIF}
Bedeutet dann wohl, dass Unicodestring UTF16LE sein müsste.
___
PS: Wie du das mit dem um eine #0 ergänzen gemeint hast, hab ich nicht richtig verstanden. (bzw, ich glaub ich weiß was du meinst, aber nicht das wie, so daß es dann komischer Weise nicht ging)
So etwas:
Delphi-Quellcode:
Result := '';
for i := 1 to Length(aStr)
do Result := Result + aStr[i] + #0;
___
Nachtrag: Danach scheint ein Unicodesting tatsächlich LE zu sein.
___
Das ist die Beschreibung in der AVM Technical Note:
Zitat:
Ermittlung des Response-Wertes
Beim neuen Login-Verfahren wird also das Klartextpasswort
login:command/password=<klartextpassword>
ersetzt durch
login:command/response=<response>
Der Response-Wert wird wie folgt gebildet:
<response> = <challenge>-<md5>
Der Wert <challenge> kann aus der Datei login_sid.xml ausgelesen werden
und <md5> ist der MD5 (32 Hexzeichen mit Kleinbuchstaben) von
<challenge>-<klartextpassword>
Der MD5-Hash wird über die Bytefolge der UTF-16LE-Codierung dieses Strings gebildet (ohne BOM und
ohne abschließende 0-Bytes).
Aus Kompatibilitätsgründen muss für jedes Zeichen, dessen
Unicode Codepoint > 255 ist, die Codierung
des "."-Zeichens benutzt werden (0x2e 0x00 in UTF-16LE). Dies betrit also alle Zeichen, die nicht in
ISO-8859-1 dargestellt werden können, z. B. das Euro-Zeichen.
Abschließend ein Beispiel mit deutschem Umlaut:
Die Challenge
<challenge> = "1234567z"
kombiniert mit dem Kennwort
<klartextpassword> = "äbc"
ergibt den Wert
<response> = "1234567z-9e224a41eeefa284df7bb0f26c2913e2"