6 Stimmen

Aufruf von RNGCrypto aus der DOTNET-Klasse von COM aus PHP

Ich versuche, RNGCryptoServiceProvider->GetBytes() von PHP über die COM-Schicht aufzurufen. Es gelingt mir, eine Verbindung zur Klasse herzustellen, aber jedes Mal, wenn ich die Methode aufrufe, erhalte ich einen von zwei Fehlern (in Bezug auf den Parameter). Ich denke, es hat etwas mit der Tatsache zu tun, dass GetBytes ein Byte-Array mit fester Größe als Referenz nimmt. Da PHP keine Strings mit fester Größe unterstützt, wird es hier interessant:

Fehler 1:

$util    = new \DOTNET(
    'mscorlib',
    'System.Security.Cryptography.RNGCryptoServiceProvider'
);
$data = new \Variant(str_repeat(chr(46), $size), VT_UI1 | VT_ARRAY);
$util->GetBytes($data);

Fehler [0x80070057] Der Parameter ist falsch

Das wird durch den ->GetBytes() Linie.

Wenn ich keine Variante, sondern nur eine einfache Zeichenfolge verwende, erhalte ich immer noch denselben Fehler.

Wenn ich jedoch ein Array wie folgt eingebe:

$data = array('');
$util->GetBytes($data);

Parameter 0: Fehlende Übereinstimmung des Typs.

Daher denke ich, dass die Variante/Zeichenkette der richtige Ansatz ist (da sie die Überprüfung des Parametertyps besteht). Aber ich kann einfach nicht herausfinden, wie man es zum Laufen bringt.

El C#-Schnittstelle zur Methode ist:

public override void GetBytes(
    byte[] data
)

Gracias

3voto

superstator Punkte 2733

Es ist Jahre her, seit ich PHP berührt habe, geschweige denn, dass ich versucht habe, mit .net zu interagieren, aber was ist, wenn Sie einen String erstellen, der auf die gewünschte Länge aufgefüllt wird, und ihn mit unpack() entpacken?

$byte_array = unpack('C*', '12345678');
$util->GetBytes($byte_array);

Nun gut, ich habe ein oder zwei Stunden damit verschwendet, ohne Ergebnis. Ich würde mir das mal ansehen:

http://www.sitepoint.com/forums/showthread.php?766246-PHP-and-NET-Secure-RndNum-Generation-using-DOTNET-class

Es gibt zwei vernünftige Möglichkeiten: Entweder Sie bauen einen einfachen Wrapper, so dass Sie einfach eine parameterlose Methode aufrufen können, oder Sie verwenden etwas, das bereits integriert und plattformübergreifend ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X