Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RSA Signatur unter PHP - Verify in Delphi (https://www.delphipraxis.net/205421-rsa-signatur-unter-php-verify-delphi.html)

jziersch 8. Sep 2020 07:24

RSA Signatur unter PHP - Verify in Delphi
 
Hallo,

eigentlich sollte dies ganz einfach sein ....

in PHP benutze ich openssl um ein public/privat key paar zu erstellen

Code:
$config = array(
         "digest_alg" => "SHA256",
         "private_key_bits" => 2048,
         "private_key_type" => OPENSSL_KEYTYPE_RSA,
     );
   
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privKey);
Und erstelle nun eine Signatur aus meinen Daten:
openssl_sign($data, $signatur, $privKey, "sha256" );

In Delphi möchte ich nun die Signatur mit dem öffentlichen Schlüssel prüfen. In PHP geht das ganz einfach:

Code:
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$ok = openssl_verify($data, $signatur, $pubKey, "sha256" );
Ich habe leider keine Delphi Anbindung an openssl gefunden die verify (oder alternativ public_decrypt) unterstützt. (private_decrypt wird u.a.hier unterstützt)

Also habe ich TMSCrypt lizensiert. Dort wird als Eingabe Parameter aber modulus/PublicExponent erwartet. Und hier komme ich nicht weiter, nicht mit RSAEncSign1.FromOpenSSLPublicKey und auch nicht durch Eintragen der Werte die ich mit PHP so ermittelt habe. Verify gibt immer -316 zurück.

Code:
$all=openssl_pkey_get_details( $res );
$rsa = $all["rsa"];
echo 'Modulus='.base64_encode ($rsa["n"]).'<br>';
echo 'Exponent='.base64_encode ($rsa["e"]).'<br>';
Hat jemand die Lösung?

Julian

jziersch 8. Sep 2020 07:29

AW: RSA Signatur unter PHP - Verify in Delphi
 
Fehler gefunden

es funktioniert!

Falls jemand dies auch machen will, hier der code zur Konvertierung

// Convert OpenSLL to TMSCrypt
RSAEncSign1.outputFormat := base64;
RSAEncSign1.withOpenSSL := true;
RSAEncSign1.FromOpenSSLPublicKey( '.....PEM' );
PublicExponentStr := RSAEncSign1.PublicExponent;
modulusStr := RSAEncSign1.modulus;

Um den Key für die Zukunft zu speichern verwendet man in PHP
openssl_pkey_export_to_file($res, "../../name.pem", "password", $config );

Das laden get dann so
$newPrivKey = openssl_pkey_get_private( "file://../../name.pem", "password" );


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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