2011-04-22 7 views
11

मैंग्ल किया गया है, मैं एक सरल प्राधिकरण योजना के साथ गड़बड़ कर रहा हूं। मुझे लगता है कि एसएसएल या अन्य HTTP एथ के बिना इसे करने का सबसे आसान तरीका एक साझा कुंजी एन्क्रिप्शन होगा। ,एक यूआरएल पैरामीटर के माध्यम से एक मैक्रिप्ट-एन्क्रिप्टेड स्ट्रिंग भेजना - डीकोडेड टेक्स्ट

$key = "This is a very secret key"; 

$iv = base64_decode($_GET["iv"]); 
$enc = base64_decode($_GET["text"]); 

$crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv); 

echo "$crypttext<br>"; 

यह बहुत करीब हो जाता है: PHP मैनुअल से एक साधारण उदाहरण के अनुकूल, मैं निम्नलिखित के साथ आया था:

$text = "boggles the invisible monkey will rule the world"; 
$key = "This is a very secret key"; 

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv); 

$iv = base64_encode($iv); 
$enc = base64_encode($enc); 

echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />'; 

पेज कि इस अनुरोध (temp2.php) इस तरह दिखता है प्राप्त करता है लेकिन यह डिकोड नहीं है properly-- यह गूँज

boggles the invisible monkey will rule t—;eôügJë

मुझे यकीन है कि क्या hangup है नहीं कर रहा हूँ, मैं urlencode/urldecode और htmlentities की कोशिश की, शायद एक चार सोच अनुरोध में अभिनेता उलझा हुआ था, लेकिन कोई फर्क नहीं पड़ता।

क्या मुझे कुछ और याद आ रही है? शायद पैडिंग?

धन्यवाद

+3

बेस 64 तार अक्सर '=' char में समाप्त होते हैं। मुझे यकीन है कि आप यूआरएल पार्सिंग के दौरान एक खो रहे हैं (क्योंकि = एक विशेष चार का कुछ है)। 'Urlencode (base64_encode())' आज़माएं? –

+1

प्लस, आपको यह डेटा पोस्ट करना चाहिए, क्योंकि स्ट्रिंग स्ट्रिंग के आकार की सीमाएं हैं (यह आधुनिक सर्वरों में है, लेकिन वे मौजूद हैं) – ircmaxell

+0

@ फ्रैंक किसान - मैंने urlencode/decode मार्ग की कोशिश की है। मदद नहीं की @ ircmaxwell - आप सही हैं, लेकिन शुरुआत में यह एक बहुत छोटी स्ट्रिंग है। – julio

उत्तर

29

ऐसा होता है कि आपके एन्क्रिप्टेड पाठ को देख की तरह कुछ खत्म हो जाएगा:

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7 

कि देखें प्लस वहाँ पर हस्ताक्षर? यूआरएल में प्लस संकेत रिक्त स्थान में बदल जाते हैं।

मैन्युअल रूप से उस प्लस को एक स्थान पर हस्ताक्षर करने और परिणाम को डिक्रिप्ट करने पर, आउटपुट दूषित जंक है जिसे आपने देखा है।

आप दोनों चतुर्थ और के माध्यम से rawurlencode (नहींurlencode) एन्क्रिप्टेड पाठ कड़ी में चिपके से पहले चलाने चाहिए। यह प्लस साइन को सही ढंग से एन्कोड करेगा, जो प्रक्रिया के माध्यम से इसे संरक्षित रखेगा। आपको urldecode दूसरी तरफ स्ट्रिंग (और नहीं होना चाहिए) - PHP आपके लिए यह कर लेगा।

+1

@ फ्रैंक, ऐसा होता है कि PHP64 डीकोड का कार्यान्वयन अंत में गायब या अतिरिक्त बराबर संकेतों को अनदेखा करता है। अन्य कार्यान्वयन इतने उदार नहीं हो सकते हैं, ताकि वास्तव में अन्य परिस्थितियों में समस्या हो। – Charles

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