Вызов RNGCrypto из класса COM DOTNET из PHP - PullRequest
6 голосов
/ 27 июня 2011

Я пытаюсь вызвать RNGCryptoServiceProvider-> GetBytes () из PHP через слой COM. Я могу заставить его подключиться к классу, но каждый раз, когда я вызываю метод, я получаю одну из двух ошибок (связанных с параметром). Я думаю, что это связано с тем, что GetBytes принимает байтовый массив фиксированного размера по ссылке. Поскольку PHP не поддерживает строки фиксированного размера, вот где он становится интересным:

Ошибка 1:

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

Ошибка [0x80070057] Неверный параметр

Который выбрасывается линией ->GetBytes().

Если я не использую вариант, а просто использую простую строку, я все равно получаю ту же ошибку.

Однако, если я передам массив следующим образом:

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

Параметр 0: несоответствие типов.

Так что я думаю, что вариант / строковый подход является правильным (так как он проходит проверку типа параметра). Но я просто не могу понять, как заставить это работать.

Интерфейс C # для метода :

public override void GetBytes(
    byte[] data
)

Спасибо

1 Ответ

3 голосов
/ 02 апреля 2014

Прошло много лет с тех пор, как я коснулся PHP, не говоря уже о том, чтобы пытаться взаимодействовать с .net, но что если вы создадите строку, дополненную до желаемой длины, и распакуете () ее?

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

Дракончик, потратил впустую час или два, играя с ним безрезультатно. Я бы посмотрел на это:

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

Здесь есть два разумных варианта - создать какую-нибудь простую оболочку, чтобы вы могли просто вызывать метод без параметров или использовать что-то встроенное и кроссплатформенное.

...