2011-06-27 10 views
6

से मैं RNGCryptoServiceProvider->() PHP से COM परत के माध्यम से कॉल करने के लिए प्रयास कर रहा GetBytes कर रहा हूँ। मैं इसे कक्षा से कनेक्ट करने के लिए प्राप्त कर सकता हूं, लेकिन हर बार जब मैं विधि को कॉल करता हूं, तो मुझे दो त्रुटियों में से एक मिलता है (पैरामीटर से संबंधित)। मुझे लगता है कि इस तथ्य के कारण कुछ है कि GetBytes संदर्भ द्वारा एक निश्चित आकार बाइट सरणी लेता है। चूंकि पीएचपी निश्चित आकार तार का समर्थन नहीं करता, कि जहां यह दिलचस्प हो जाता है: 1कॉम के DotNet कक्षा से RNGCrypto कॉलिंग पीएचपी

त्रुटि:

$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 
) 

धन्यवाद

+0

यह हो सकता है नहीं समाधान आप के लिए देख रहे हैं, लेकिन क्यों एक सरल खिड़कियों सेवा प्राप्त करता है कि जो कुछ भी आप PHP से भेजना चाहते हैं और फिर बस इनकोडिंग मूल्य वापस नहीं बनाने (सी # में सभी प्रसंस्करण करते हैं)? –

+2

@ गुस्तावो रूबियो यह लाइब्रेरी कोड के लिए है। असल में एक पोर्टेबल पीआरएनजी का हिस्सा जो सभी प्लेटफॉर्म पर मजबूत यादृच्छिकता उत्पन्न करने का प्रयास करता है। तो सिस्टम कॉल के अलावा अन्य सेवाएं या कुछ भी वास्तव में स्वीकार्य नहीं है (जो मैं कर रहा हूं)। अच्छा विचार हालांकि ... – ircmaxell

उत्तर

3

यह साल हो चुके हैं मैं PHP छुआ, अकेले अगर तुम बनाने के .net साथ Interop करने की कोशिश की है, लेकिन क्या एक स्ट्रिंग अपने इच्छित लंबाई करने के लिए गद्देदार और अनपैक() यह?

$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

दो उचित विकल्प - किसी तरह के एक सरल आवरण का निर्माण तो आप सिर्फ एक parameterless विधि कॉल कर सकते हैं, या कुछ और पार मंच में बनाया का उपयोग करें।

+0

धन्यवाद आदमी। मैं पहले से ही उस धागे में आया था .. जब मैं 'मैक्रिप्ट' अक्षम करता हूं तो मैं विंडोज़ समाधान की तलाश में था। –

+1

एक व्यावहारिक दृष्टिकोण से, हाँ, का उपयोग करते हुए 'mcrypt_create_iv' या एक कस्टम आवरण वस्तु एक विशिष्ट अनुप्रयोग में उपयोगी होगा। यह सवाल एक सामान्य उपयोग, जहां आप एक आवरण वस्तु (पहुँच नहीं) स्थापित नहीं कर सकता के लिए और अधिक है और आप अगर mcrypt स्थापित किया गया है (यह भी पहुँच नहीं) नियंत्रित नहीं कर सकते हैं या नहीं ... के बाद से COM सक्षम किया गया है, उम्मीद है कि वहाँ होगा इस ... – ircmaxell

+0

यहाँ करने के लिए, कोशिश कर के लिए वैसे भी इनाम लेने के एक तरीका हो: पी –

संबंधित मुद्दे