从PHP的COM的DOTNET类调用RNGCrypto

时间:2011-06-27 19:08:12

标签: php .net com reference variant

我试图通过COM层从PHP调用RNGCryptoServiceProvider-> GetBytes()。我可以让它连接到类,但每次调用方法时,我都会得到两个错误之一(与参数有关)。我认为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# interface to the method是:

public override void GetBytes(
    byte[] data
)

由于

1 个答案:

答案 0 :(得分:3)

自从我接触PHP以来,已经有好几年了,更不用说尝试与.net进行互操作了,但是如果你创建一个填充到你想要的长度的字符串并解压缩()呢?

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

Whelp,浪费了一两个小时玩它没有结果。我来看看这个:

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

有两个合理的选项 - 构建一个简单的包装器,这样你就可以调用无参数方法,或者使用内置和跨平台的东西。