2013-03-14 4 views
5
में डिक्रिप्ट

मान लें मैं एक सार्वजनिक-निजी कुंजी युग्म को उत्पन्न करने के लिए निम्न जावा कोड है:RSA एन्क्रिप्शन, पीएचपी

KeyPairGenerator generator = KeyPairGenerator.getInstance ("RSA"); 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 

generator.initialize (1024, random); 

KeyPair pair = generator.generateKeyPair(); 
RSAPrivateKey priv = (RSAPrivateKey)pair.getPrivate(); 
RSAPublicKey pub = (RSAPublicKey)pair.getPublic(); 

// Sign a message 
Signature dsa = Signature.getInstance("SHA1withRSA"); 
dsa.initSign (priv); 
dsa.update ("Hello, World".getBytes(), 0, "Hello, World".length()); 

byte[] out = dsa.sign(); 
/* save the signature in a file */ 
FileOutputStream sigfos = new FileOutputStream("sig"); 
sigfos.write(out); 
sigfos.close(); 

एक के बारे में कैसे जाना है और PHP में फाइल "sig" डिक्रिप्ट हैं? मैंने पोस्ट पढ़ा है: https://stackoverflow.com/a/1662887/414414 जो DER फ़ाइल को PEM में परिवर्तित करने के लिए एक फ़ंक्शन प्रदान करता है (मान लें कि मैं जावा से सार्वजनिक कुंजी भी सहेजता हूं)।

मैं की तरह कुछ की कोशिश की है:

$key = openssl_pkey_get_public ("file://pub_key.pem"); 
$data = null; 
openssl_public_decrypt (file_get_contents ("sig"), $data, $key); 
echo $data, "\n"; 

यह सफलतापूर्वक संदेश decrypts, लेकिन यह कई अजीब वर्ण है।

हमारा परिदृश्य एक जावा क्लाइंट है जो एक PHP सर्वर पर संदेश भेज रहा है, लेकिन डेटा को एक निजी कुंजी से एन्क्रिप्ट करता है। PHP सार्वजनिक कुंजी के बारे में जानता है, जिसे इसे संदेश को डिक्रिप्ट और सत्यापित करने के लिए उपयोग करना चाहिए।

मैंने एसओ पर इस मुद्दे के बारे में बहुत सी पोस्ट पढ़ी हैं, लेकिन मुझे एहसास हुआ है कि यह एक विशिष्ट मुद्दा है, खासकर यदि उपयोग में अलग-अलग एल्गोरिदम हैं, तो क्षमा करें यदि यह हो सकता है एक डुप्लिकेट

कोई भी प्रतिक्रिया बहुत सराहना की जाती है!

+2

"यह सफलतापूर्वक संदेश को अस्वीकार करता है, लेकिन यह कई अजीब पात्र हैं।" - क्या आप इसके बारे में अधिक विशिष्ट हो सकते हैं? क्या यह बस एक एन्कोडिंग मुद्दा हो सकता है? –

+1

क्या डीकोडेड संदेश प्रकार मूल पाठ की तरह दिखता है, या यह पूरी तरह से खराब है? –

+0

क्या आप जावा और PHP के बीच भेजे गए संदेशों को सत्यापित करने की कोशिश कर रहे हैं, या उन्हें एन्क्रिप्ट कर रहे हैं? अथवा दोनों? –

उत्तर

3

"आरएसए हस्ताक्षर" आमतौर पर "निजी कुंजी के साथ एन्क्रिप्ट करें, सार्वजनिक कुंजी के साथ डिक्रिप्ट" से अधिक है, क्योंकि पीकेसीएस # 1 जैसे सार्वजनिक कुंजी प्रोटोकॉल पैडिंग योजनाएं भी निर्दिष्ट करते हैं, और सभी हस्ताक्षर योजना संदेश की पाचन को एन्क्रिप्ट करेंगे , पूर्ण संदेश के बजाय। यदि जावा की हस्ताक्षर योजना पीकेसीएस # 1 में निर्दिष्ट हस्ताक्षर पैडिंग योजना का उपयोग करती है, तो मुझे कोई दस्तावेज नहीं मिल रहा है, लेकिन मेरा संदेह यह है कि यह है।

यदि ऐसा है, तो आप PHP में openssl_verify विधि का उपयोग करना चाहते हैं, here दस्तावेज। अगर हस्ताक्षर अमान्य या वैध है, तो यह 0 या 1 लौटाएगा।

यदि जावा पैडिंग योजना का उपयोग नहीं करता है, तो आपकी समस्या यह है कि हस्ताक्षर में एन्क्रिप्ट किया गया डेटा संदेश के बजाय हैश का संदेश है (आप जावा कोड में देख सकते हैं जो यह उपयोग करता है एसएचए -1 हैश एल्गोरिदम)। तो PHP पक्ष पर, आपको sha1 method$raw_output के साथ सत्य पर सेट sha1 method का उपयोग करके अपने संदेश का sha1 हैश लेने की आवश्यकता होगी, और यह सुनिश्चित करने के लिए उन तारों की तुलना करें कि आपका संदेश मान्य है।

+0

आपको बहुत बहुत धन्यवाद! चूंकि हस्ताक्षर विभिन्न HTTP शीर्षकों और उसके मानों पर आधारित होने जा रहा है, इसलिए मैं इसे सर्वर के पक्ष में एक साथ रख सकता हूं और जांच सकता हूं कि हस्ताक्षर मान्य है या नहीं: 'openssl_verify (" हैलो, वर्ल्ड ", file_get_contents ('sig'), $ pubkey) '। और यह काम करता है ;-) – DavidS

+0

मुझे लगता है कि मुझे वही प्रश्न मिला है .... लेकिन openssl_verify() मेरे लिए काम नहीं करता है .... [प्रश्न लिंक] (http://stackoverflow.com/questions/16370046/use -php-openssl-verify-function-to-verify-signature-and-data-created-by-androi) कृपया मदद करें, अग्रिम धन्यवाद – shanwu

-1
टुकड़ा

$key = openssl_pkey_get_public ("file://pub_key.pem"); 

ऐसा लगता है कि आप सार्वजनिक कुंजी है, जो गलत एक डिक्रिप्ट करने के लिए किया जाएगा संदर्भित कर रहे हैं की तरह से

। दोहरी जाँच ?

+0

यह हस्ताक्षर सत्यापन है, इसलिए सार्वजनिक कुंजी का उपयोग करना मेरे लिए सही लगता है। – Henrik

+0

एक हस्ताक्षर सत्यापन है, हां, तो सर्वर को कभी भी निजी कुंजी नहीं जाननी चाहिए .. – DavidS

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