2011-06-27 4 views
6

Próbuję wywołać RNGCryptoServiceProvider-> GetBytes() z PHP przez warstwę COM. Mogę go podłączyć do klasy, ale za każdym razem, gdy wywołuję metodę, otrzymuję jeden z dwóch błędów (odnoszących się do parametru). Sądzę, że ma to coś z powodu faktu, że GetBytes pobiera macierz o stałej wielkości przez odniesienie. Ponieważ PHP nie obsługuje stałych rozmiarach sznurki, to gdzie robi się ciekawie:Wywołanie RNGCrypto z klasy DOTNET COM z PHP

Błąd 1:

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

Błąd [0x80070057] Parametr jest niepoprawny

Która jest wyrzucane przez linia ->GetBytes().

Jeśli nie używam wariantu, ale używam zwykłego łańcucha, nadal otrzymuję ten sam błąd.

Jednakże, jeśli przechodzą w tablicy tak:

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

parametrów 0: Niezgodność typów.

Uważam, że podejście wariant/łańcuch jest poprawne (ponieważ przechodzi kontrolę typu parametru). Ale nie mogę pojąć, jak to działa.

C# interface to the method jest:

public override void GetBytes(
    byte[] data 
) 

Dzięki

+0

Może to nie jest rozwiązanie, którego szukasz, ale dlaczego nie utworzyć prostej usługi systemu Windows, która odbiera wszystko, co chcesz wysłać z PHP, a następnie po prostu zwróci wartość zakodowaną (czy wszystkie przetwarzanie w języku C#)? –

+2

@GustavoRubio to jest do kodu biblioteki. Właściwie jest to część przenośnego PRNG, który próbuje wytwarzać silną losowość na wszystkich platformach. Więc usługi lub cokolwiek innego niż wywołania systemowe nie są naprawdę akceptowane (co robię). Miły pomysł jednak ... – ircmaxell

Odpowiedz

3

Minęło lat odkąd dotknął PHP, nie mówiąc już próbował współdziałanie z .NET, ale co jeśli utworzyć ciąg wyściełane do żądanej długości i rozpakuj() to?

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

szczenię, zmarnowany godzinę lub dwie gry z nim do żadnego rezultatu. Proszę spojrzeć na to:

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

Dwie opcje istnieją uzasadnione - zbudować prosty wrapper jakiegoś rodzaju więc można po prostu wywołać metodę bez parametrów, lub użyć coś wbudowane i cross-platform.

+0

Dzięki człowieku. Już natknąłem się na ten wątek. Szukałem rozwiązania dla Windows, gdy 'mcrypt' jest wyłączony. –

+1

Z praktycznego punktu widzenia, tak, użycie 'mcrypt_create_iv' lub niestandardowego obiektu opakowania byłoby przydatne w konkretnej aplikacji. To pytanie jest bardziej ogólne, gdzie nie można zainstalować obiektu opakowania (brak dostępu) i nie można kontrolować, czy mcrypt jest zainstalowany, czy też nie (także brak dostępu) ... Ponieważ tryb COM jest włączony, mam nadzieję, że być metodą, aby to zrobić ... – ircmaxell

+0

tutaj, weź nagrodę za próbowanie: P –

Powiązane problemy