2010-04-09 13 views
9

में डिक्रिप्ट करने के लिए PHP में मैं आरएसए संदेश को एनक्रिप्ट .NET अनुप्रयोग द्वारा decrypted जा करने के लिए कर रहा हूँ ... लेकिन मैं नेट से एक "बुरा कुंजी" अपवाद मिलती रहती है ....आरएसए एन्क्रिप्ट नेट

आरएसए एन्क्रिप्शन के लिए, मैं पियर क्लास Crypt_RSA-> सार्वजनिक कुंजी के साथ एन्क्रिप्ट कर रहा हूं (जो एक मॉड्यूलस, एक्सपोनेंट जोड़ी है) मैं .NET में काम कर रहा एन्क्रिप्शन सिस्टम से प्राप्त करता हूं ...

मुझे लगता है कि सबसे आसान सवाल होगा -> "खराब कुंजी" का मतलब है कि यह संदेश को डिक्रिप्ट करने में सक्षम नहीं है? आईई, यह सही ढंग से एन्क्रिप्ट नहीं किया गया है?

कठिन सवाल यह है-> क्या आरएसए एन्क्रिप्शन के बारे में कुछ विशिष्ट है जो .NET और PHP के बीच quirks का कारण बनता है?

+1

कुंजी के साथ कोई समस्या हो सकती है? अजीब पात्र, यूनिकोड और यूटीएफ -8 के बीच समस्या? –

+0

आप अलग-अलग पैडिंग का उपयोग कर रहे हैं। – SLaks

+0

आरई: पैडिंग: स्ट्रिंग के बारे में क्या है? इस मामले में, यह बिल्कुल 32 बाइट्स है - जो 8 तक विभाजित है ... तो क्या मुझे यह कवर किया गया है? – user312904

उत्तर

3

पीएआर पर Crypt_RSA पीकेसीएस # 1 एन्कोडिंग का उपयोग नहीं कर रहा है। मुझे संदेह है कि यही कारण है कि .NET आपको एक त्रुटि संदेश दे रहा है।

print $rsa_obj->encryptBinary("1234567", $key_pair->getPublicKey()); 

कि के उत्पादन में ले रहा है और यह पाइप:

यह तोड़ने का एक उदाहरण के रूप में, मैं स्ट्रिंग एन्क्रिप्ट करने के लिए Crypt_RSA का उपयोग कर "1234567" (मैं कुंजी लोड हो रहा है दिखा छोड़ देंगे) एक PHP स्क्रिप्ट बनाया openssl कमांड लाइन टूल के माध्यम से निम्न त्रुटि देता है:

$ ./crypt | openssl rsautl -inkey privkey.pem -decrypt 
RSA operation error 
18437:error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for modulus:fips_rsa_eay.c:558: 

openssl डिफ़ॉल्ट रूप से 1 गद्दी उम्मीद PKCS #, लेकिन रॉ जोड़ने (कोई पैडिंग) openssl करने के लिए ध्वज या तो मदद नहीं करता है।

$pem = file_get_contents("pubkey.pem"); 
$key = openssl_pkey_get_public($pem); 

$encrypted = ""; 
if(openssl_public_encrypt("1234567", $encrypted, $key)) { 
    print $encrypted; 
} else { 
    print "failed\n"; 
} 

और php में डिक्रिप्ट कोड:

संदर्भ में
$pem = file_get_contents("privkey.pem"); 
$key = openssl_pkey_get_private($pem); 

$enc_data = file_get_contents("openssl.crypted"); 
$decrypted = ""; 
if(openssl_private_decrypt($enc_data, $decrypted, $key)) { 
    print "$decrypted\n"; 
} else { 
    print "failed\n"; 
} 

प्रमाण पत्र

php में openssl एक्सटेंशन का उपयोग करना उचित गद्दी (चूक PKCS # 1 के लिए, दूसरों उपलब्ध है) देता है आरएसए के एक्स.50 9 प्रमाण पत्र हैं, जो आरएसए कुंजी और उन चाबियों के बारे में डेटा हैं। एसएसएल में X.50 9 प्रमाण पत्र का उपयोग किया जाता है, लेकिन आरएसए का उपयोग करने की आवश्यकता नहीं है।

14

Security Warning: Use OAEP, not PKCS#1 .

आप एक समाधान है कि openssl विस्तार की आवश्यकता नहीं है का उपयोग करना चाहते हैं, तो phpseclib के Crypt_RSA प्रयास करें। उदाहरण का पालन करें:

openssl rsautl -inkey privatekey.txt -encrypt -इन plaintext.txt आउट ciphertext.txt

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->loadKey(file_get_contents('privatekey.txt')); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
echo $rsa->decrypt(file_get_contents('ciphertext.txt')); 
?> 

PKCS साथ एन्क्रिप्शन:

PKCS # 1 गद्दी के साथ डिक्रिप्शन # 1 गद्दी:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->loadKey(file_get_contents('privatekey.txt')); 
$rsa->loadKey($rsa->getPublicKey()); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
echo $rsa->encrypt('1234567890'); 
?> 

openssl rsautl -inkey privatekey.tx टी -decrypt -इन ciphertext.txt आउट plaintext.txt

OAEP गद्दी के साथ डिक्रिप्शन:

openssl rsautl -inkey privatekey.txt -encrypt -oaep -इन plaintext.txt आउट सिफर।txt

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->loadKey(file_get_contents('privatekey.txt')); 
echo $rsa->decrypt(file_get_contents('ciphertext.txt')); 
?> 

OAEP गद्दी के साथ एन्क्रिप्शन:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->loadKey(file_get_contents('privatekey.txt')); 
$rsa->loadKey($rsa->getPublicKey()); 
echo $rsa->encrypt('1234567890'); 
?> 

openssl rsautl -inkey privatekey.txt -decrypt -oaep -इन ciphertext.txt आउट plaintext.txt

phpseclib हो सकता है http://phpseclib.sourceforge.net/

से डाउनलोड किया गया शुभकामनाएं!

+0

यह अच्छा है, लेकिन मैं दृढ़ता से ओएईपी की सिफारिश करता हूं और कभी भी पैडिंग ऑरैकल हमलों के कारण पीकेसीएस 1 पैडिंग का उपयोग नहीं करता। –

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