Übersetzen PHP -> Xbase [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 213
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 16 Mal
Danksagung erhalten: 4 Mal

Übersetzen PHP -> Xbase [ERLEDIGT]

Beitrag von Dominik Krebs »

Hallo zusammen,
ich benötige Hilfe beim übersetzen einer Funktion von PHP nach Xbase++.

Code: Alles auswählen

function createPasswordDiggest(){
		global $I_NONCE;
		global $I_CREATED;
		global $I_PASS_MD5;
		global $I_PIN;
		global $I_MTAN;
		global $I_API_USER;
		global $I_API_PASS;
		
		return base64_encode( pack('H*', sha1( pack('H*', $I_NONCE) . pack('a*',$I_CREATED) . pack('a*',$I_PASS_MD5) . pack('a*',$I_PIN). pack('a*',$I_MTAN). pack('a*',$I_API_PASS))));
	}
Hauptsächlich geht es mir um

Code: Alles auswählen

pack('H*','WERT')
sowie

Code: Alles auswählen

pack('a*','WERT')
Gibt es hier jemanden, der sich damit auskennt?
Zuletzt geändert von Dominik Krebs am Mo, 01. Jul 2024 14:49, insgesamt 1-mal geändert.
Gruß Dominik
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9412
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 109 Mal
Danksagung erhalten: 367 Mal
Kontaktdaten:

Re: Übersetzen PHP -> Xbase

Beitrag von Tom »

Herzlich,
Tom
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 213
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 16 Mal
Danksagung erhalten: 4 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von Dominik Krebs »

Hallo Tom,
diese Beschreibung habe ich mir natürlich schon angeschaut.
Das Problem, ich kenne ich einfach nicht gut genug damit aus.

Beispielsweise habe ich keine Ahnung was der Obere und der Untere Halbwert ist...

Ich dachte, es gibt jemanden der so freundlich ist mir zu helfen.
Gruß Dominik
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 494
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 14 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von azzo »

Hallo Dominik,
ich bekomme ein Ergebnis.
Kann aber nicht sagen, ob der Wert passt.
LG
Otto

Code: Alles auswählen


#include "FiveWin.ch"

PROCEDURE Main
    
    ? CreatePasswordDiggest()
RETURN


FUNCTION CreatePasswordDiggest()
    LOCAL I_NONCE := "nonce_value"
    LOCAL I_CREATED := "created_value"
    LOCAL I_PASS_MD5 := "pass_md5_value"
    LOCAL I_PIN := "pin_value"
    LOCAL I_MTAN := "mtan_value"
    LOCAL I_API_USER := "api_user_value"
    LOCAL I_API_PASS := "api_pass_value"
    
    LOCAL combinedData
    LOCAL sha1Hash
    LOCAL base64Digest

    // Kombiniere alle Daten
    combinedData := I_NONCE + I_CREATED + I_PASS_MD5 + I_PIN + I_MTAN + I_API_PASS

    // Erstelle SHA-1 Hash
    sha1Hash := hb_sha1(combinedData)

    // Base64-kodieren des Hashes
    base64Digest := hb_base64Encode(sha1Hash)

    RETURN base64Digest



Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 213
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 16 Mal
Danksagung erhalten: 4 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von Dominik Krebs »

Hallo Otto,
was hat es den nun mit den beiden Funktionen

Code: Alles auswählen

pack('H*','WERT')
pack('a*','WERT')
auf sich? In deinem Code sind Sie ja nun nicht vorhanden. So wie ich das verstehe, wird durch diese Funktion ein wert in die Binäre Darstellung gewandelt. Ich habe versucht das in Xbase++ mit Var2Bin() abzubilden, aber da kommt etwas vollständig anderes heraus ...
Gruß Dominik
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9412
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 109 Mal
Danksagung erhalten: 367 Mal
Kontaktdaten:

Re: Übersetzen PHP -> Xbase

Beitrag von Tom »

Man müsste mal anhand eines Beispiels nachvollziehen, was die PHP-Funktion "Pack" genau macht. Hier ginge das: https://www.w3schools.com/php/phptryit. ... _misc_pack
Herzlich,
Tom
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 494
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 14 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von azzo »

Hallo Domenik,
kannst du diesen Code testen?

Code: Alles auswählen


// DBFToTXT
#include "FiveWin.ch"

PROCEDURE Main
    
   PasswordDiggest()
RETURN


FUNCTION PasswordDiggest()
    LOCAL I_NONCE := "48656c6c6f" // Beispiel für einen hexadezimalen String
    LOCAL I_CREATED := "created_value"
    LOCAL I_PASS_MD5 := "pass_md5_value"
    LOCAL I_PIN := "pin_value"
    LOCAL I_MTAN := "mtan_value"
    LOCAL I_API_PASS := "api_pass_value"
    LOCAL payload := "zusätzlicher_payload"
    LOCAL receivedDigest
    LOCAL verificationResult

    // Erstelle den Digest der Daten
    receivedDigest := CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )

    // Ausgabe der zu sendenden Daten und des Digests
    ? "Zu sendende D a t e n:"
    ? "I_NONCE:", I_NONCE
    ? "I_CREATED:", I_CREATED
    ? "I_PASS_MD5:", I_PASS_MD5
    ? "I_PIN:", I_PIN
    ? "I_MTAN:", I_MTAN
    ? "I_API_PASS:", I_API_PASS
    ? "payload:", payload
    ? "digest:", receivedDigest

    // Überprüfen Sie den empfangenen Digest
    verificationResult := VerifyPasswordDiggest( receivedDigest, I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )




    IF verificationResult
        ? "Verifizierung erfolgreich"
    ELSE
        ? "Verifizierung fehlgeschlagen"
    ENDIF

    RETURN  
 

// Funktion zum Konvertieren eines hexadezimalen Strings in binär
FUNCTION HexToBin( hexStr )
    LOCAL binStr := ""
    LOCAL i
    FOR i := 1 TO LEN( hexStr ) STEP 2
        binStr += CHR( VAL( "&H" + SUBSTR( hexStr, i, 2 ) ) )
    NEXT
    RETURN binStr

// Funktion zum Konvertieren eines Strings in binär mit Null-Byte-Auffüllung
FUNCTION StringToBin( str )
    RETURN str + REPLICATE( CHR(0), LEN(str) )


// Funktion zum Erstellen des Digests mit einem zusätzlichen Payload
FUNCTION CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )
    LOCAL combinedData
    LOCAL sha1Hash
    LOCAL base64Digest

    // Kombiniere alle Daten und den zusätzlichen Payload
    combinedData := HexToBin(I_NONCE) + StringToBin(I_CREATED) + StringToBin(I_PASS_MD5) + StringToBin(I_PIN) + StringToBin(I_MTAN) + StringToBin(I_API_PASS) + StringToBin(payload)

    // Erstelle SHA-1 Hash
    sha1Hash := hb_sha1(combinedData)

    // Base64-kodieren des Hashes
    base64Digest := hb_base64Encode(sha1Hash)

    RETURN base64Digest

// Funktion zur Überprüfung des Digests mit einem zusätzlichen Payload
FUNCTION VerifyPasswordDiggest( receivedDigest, I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )
    LOCAL computedDigest

    // Erstelle den Digest mit den empfangenen Daten und dem zusätzlichen Payload
    computedDigest := CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )

    // Vergleiche den erstellten Digest mit dem empfangenen Digest
    IF computedDigest == receivedDigest
        RETURN .T.  // Verifizierung erfolgreich
    ELSE
        RETURN .F.  // Verifizierung fehlgeschlagen
    ENDIF
RETURN


Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 213
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 16 Mal
Danksagung erhalten: 4 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von Dominik Krebs »

Hallo Otto,
beim Aufruf von

Code: Alles auswählen

HexToBin("48656c6c6f") 
erhalte ich als Ergebnis in Hex 00 00 00 00 00.
Als Binär ist es NUL NUL NUL NUL
Irgendwie sieht mir das komisch aus.

Der Code ähnelt aber auch stark dem von ChatGPT, als ich es um Hilfe gebeten habe :D :D :D
Gruß Dominik
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15720
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 76 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Übersetzen PHP -> Xbase

Beitrag von brandelh »

Tom hat geschrieben: Mo, 01. Jul 2024 10:20 Man müsste mal anhand eines Beispiels nachvollziehen, was die PHP-Funktion "Pack" genau macht. Hier ginge das: https://www.w3schools.com/php/phptryit. ... _misc_pack
genau, probieren geht über studieren ;-)

Gerade wenn es auf jedes Byte (Bit) ankommt, würde ich austesten was rauskommt und dann versuchen das gleiche Ergebnis mit eigener Funktion zu bekommen.
Bei crypt() hatte ich damit aber keinen Erfolg :)
Gruß
Hubert
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 665
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 102 Mal
Kontaktdaten:

Re: Übersetzen PHP -> Xbase

Beitrag von nightcrawler »

Du könntest Mal Beispielwerte für die ganzen Variablen einstellen. Ich erzeuge Dir gerne daraus die PHP Ausgabe.
$wert=pack('a*',$I_API_PASS);
liefert im Prinzip (Einagbe 123) genau den Eingabewert.
$wert=pack('H*', $I_NONCE);
liefert eine Umwandung (H Hex-Zeichenkette, oberer Halbwert zuerst, * bis zum Ende)
bei 123 ist es 0, bei 0xABCD kommt "C�"
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 494
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 14 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von azzo »

Hallo Dominik,
ja, ich verwende sehr viel ChatGPT. Ich habe mir auch gute Tools dafür gebaut, um die Prompts zu formulieren. Siehe Screenshot weiter unten.
OT:
Vor kurzem habe ich ein Projekt gestartet, zuerst DBF-Dateien ohne RDD auszulesen direkt mit Low Level. Begonnen habe ich mit PHP, dann habe ich es auf Harbour umgeschrieben. Es ist erstaunlich, welche guten Resultate man mit ChatGPT erzielt.
Am Wochenende habe ich dann wieder am PHP Browser und der Volltextsuche und der Suche in einem Feld weitergearbeitet. Ich bin nun bei Zugriffszeiten von 50-100 ms.
Nun kann ich mit PHP ohne Zusätze DBF auslesen und schreiben. Indexe nicht.

LG
Otto

Hier nochmals ein neuer Versuch - ich denke, der passt jetzt.

Der Hexadezimalwert "48656c6c6f" repräsentiert die Zeichenkette "Hello" im ASCII-Code. Lassen Sie uns den Konvertierungsprozess Schritt für Schritt durchgehen:

Hexadezimal zu ASCII:

48 -> H
65 -> e
6c -> l
6c -> l
6f -> o
ASCII zu Binär (in 8-Bit-Binärdarstellung für jedes Zeichen):

H (ASCII 72) -> 01001000
e (ASCII 101) -> 01100101
l (ASCII 108) -> 01101100
l (ASCII 108) -> 01101100
o (ASCII 111) -> 01101111

// DBFToTXT
#include "FiveWin.ch"

PROCEDURE Main

PasswordDiggest()
RETURN


FUNCTION PasswordDiggest()
LOCAL I_NONCE := "48656c6c6f" // Beispiel für einen hexadezimalen String
LOCAL I_CREATED := "created_value"
LOCAL I_PASS_MD5 := "pass_md5_value"
LOCAL I_PIN := "pin_value"
LOCAL I_MTAN := "mtan_value"
LOCAL I_API_PASS := "api_pass_value"
LOCAL payload := "zusätzlicher_payload"
LOCAL receivedDigest
LOCAL verificationResult

// Erstelle den Digest der Daten
receivedDigest := CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )
/*
// Ausgabe der zu sendenden Daten und des Digests
? "Zu sendende D a t e n:"
? "I_NONCE:", I_NONCE
? "I_CREATED:", I_CREATED
? "I_PASS_MD5:", I_PASS_MD5
? "I_PIN:", I_PIN
? "I_MTAN:", I_MTAN
? "I_API_PASS:", I_API_PASS
? "payload:", payload
? "digest:", receivedDigest
*/
// Überprüfen Sie den empfangenen Digest
verificationResult := VerifyPasswordDiggest( receivedDigest, I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )




IF verificationResult
? "Verifizierung erfolgreich"
ELSE
? "Verifizierung fehlgeschlagen"
ENDIF

RETURN


// Funktion zum Konvertieren eines hexadezimalen Strings in binär
FUNCTION HexToBin( hexStr )
LOCAL binStr := ""
LOCAL i
LOCAL hexPair
LOCAL chrValue

? "***** Hex String:", hexStr
FOR i := 1 TO LEN( hexStr ) STEP 2
hexPair := SUBSTR( hexStr, i, 2 )
chrValue := HexPairToChar(hexPair)
? "Hex Pair:", hexPair, "->", "Char Value:", chrValue
binStr += chrValue
NEXT

? "Binary String:", binStr
RETURN binStr

FUNCTION HB_HexVal( hexChar )
RETURN VAL( "&H" + hexChar )

// Funktion zum Konvertieren eines Strings in binär mit Null-Byte-Auffüllung
FUNCTION StringToBin( str )
RETURN str + REPLICATE( CHR(0), LEN(str) )




// Funktion zum Konvertieren eines Hex-Paares in ein Zeichen
FUNCTION HexPairToChar( hexPair )
LOCAL highNibble := HB_HexDigitVal( SUBSTR( hexPair, 1, 1 ) )
LOCAL lowNibble := HB_HexDigitVal( SUBSTR( hexPair, 2, 1 ) )
RETURN CHR( ( highNibble * 16 ) + lowNibble )

// Funktion zum Konvertieren eines einzelnen Hex-Zeichens in einen Dezimalwert
FUNCTION HB_HexDigitVal( hexDigit )
LOCAL digit := ASC( hexDigit )
IF digit >= 48 .AND. digit <= 57 // '0'-'9'
RETURN digit - 48
ELSEIF digit >= 65 .AND. digit <= 70 // 'A'-'F'
RETURN digit - 55
ELSEIF digit >= 97 .AND. digit <= 102 // 'a'-'f'
RETURN digit - 87
ELSE
RETURN 0
ENDIF
RETURN
// Funktion zum Erstellen des Digests mit einem zusätzlichen Payload
FUNCTION CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )
LOCAL combinedData
LOCAL sha1Hash
LOCAL base64Digest



// Kombiniere alle Daten und den zusätzlichen Payload
combinedData := HexToBin(I_NONCE) + StringToBin(I_CREATED) + StringToBin(I_PASS_MD5) + StringToBin(I_PIN) + StringToBin(I_MTAN) + StringToBin(I_API_PASS) + StringToBin(payload)

// Erstelle SHA-1 Hash
sha1Hash := hb_sha1(combinedData)

// Base64-kodieren des Hashes
base64Digest := hb_base64Encode(sha1Hash)

RETURN base64Digest

// Funktion zur Überprüfung des Digests mit einem zusätzlichen Payload
FUNCTION VerifyPasswordDiggest( receivedDigest, I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )
LOCAL computedDigest

// Erstelle den Digest mit den empfangenen Daten und dem zusätzlichen Payload
computedDigest := CreatePasswordDiggest( I_NONCE, I_CREATED, I_PASS_MD5, I_PIN, I_MTAN, I_API_PASS, payload )

// Vergleiche den erstellten Digest mit dem empfangenen Digest
IF computedDigest == receivedDigest
RETURN .T. // Verifizierung erfolgreich
ELSE
RETURN .F. // Verifizierung fehlgeschlagen
ENDIF
RETURN
Bild

Bild

Bild
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 213
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 16 Mal
Danksagung erhalten: 4 Mal

Re: Übersetzen PHP -> Xbase

Beitrag von Dominik Krebs »

Hallo zusammen,
ich habe es geschafft.

Um Pack('H*' 'WERT') in Xbase zu übersetzen, habe ich folgende Funktion verwendet:

Code: Alles auswählen

FUNCTION HexToBinPackH(cHexString)
LOCAL nLen, cBinString, nI, cHexPair, nValue

         cBinString := ""
         nLen := LEN(cHexString)
         
         FOR nI := 1 TO nLen STEP 2
         cHexPair := SUBSTR(cHexString, nI, 2)

         IF len(cHexPair) == 1
         cHexPair +="0"
         ENDIF

         nValue := HexToNum(cHexPair)
         cBinString += CHR(nValue)
         NEXT

RETURN cBinString
Hierzu hat mir @Huberts Funktion sehr weitergeholfen

Code: Alles auswählen

function HexToNum(cHex)
   local x,y,nLenX,i,nWert,cH
   i     := 0                  // Erste Stelle 16^i == 16^0
   cH    := "123456789ABCDEF"  // "0"-"F" -> in Zahl umsetzen, wobei AT() "0" -> 0 ergibt
   nLenX := len(cHex)          // Länge des HEX-Strings ergibt die Anzahl an Stellen
   nWert := 0                  // hier wird der Wert addiert
   for x := nLenX TO 1 STEP -1
       y := AT(cHex[x],cH) // "0" -> 0, "1" -> 1 ... "F" -> 15
       nWert += y * 16^i       // Wert dieser Stelle addieren
       i++                     // Index erhöhen ...
   next
return int(nWert)
Was Pack('a*','WERT') angeht.. Ich habe nun wirklich viel probiert und versucht. Aber ich kann einfach keine Änderung mit und ohne Funktionsaufruf festtellen. Aus diesem Grund habe ich es weggelassen und es funktioniert trotzdem wunderbar :)
Gruß Dominik
Antworten