2011-09-15 15 views
5

phpass बेस 64 एन्कोड के लिए encode64() में एक अजीब (मेरे लिए) एल्गोरिदम का उपयोग करता है। Base64 और Uuencode एक प्रिंट करने योग्य चार पर मैपिंग करने से पहले प्रत्येक ऑक्टेट का उत्पादन करने के लिए रैखिक रूप से 6 बिट्स को घुमाएं। encode64 आसपास बिट्स shuffles:फ़ेस का कस्टम बेस 64 एन्कोडर: क्या इसका बेस 64 पर नाम/लाभ है?

input bit location: abcdefgh ijklmnop qrstuvwx 
base64 bit location: ..abcdef ..ghijkl ..mnopqr ..stuvwx 
encode64 bit location: ..cdefgh ..mnopab ..wxijkl ..qrstuv 

इस एल्गोरिथ्म सामान्यतः ज्ञात है? और पिछड़े संगतता के अलावा, इसे बेस 64 पर क्यों चुनें?

नीचे मैं इसे फिर से लिख दिया एल्गोरिथ्म स्पष्ट करने के लिए: '।'

function encode64($input, $bytesToProcess) 
{ 
    // convert to array of ints 
    for ($i = 0; $i < $bytesToProcess; $i++) { 
     $bytes[] = ord($input[$i]); 
    } 

    $octets = array(); 
    $i = 0; 
    do { 
     $value = $bytes[$i++]; 
     $octets[] = $value & 0x3f; 
     if ($i < $bytesToProcess) { 
      $value |= $bytes[$i] << 8; 
     } 
     $octets[] = ($value >> 6) & 0x3f; 
     if ($i++ >= $bytesToProcess) { 
      break; 
     } 
     if ($i < $bytesToProcess) { 
      $value |= $bytes[$i] << 16; 
     } 
     $octets[] = ($value >> 12) & 0x3f; 
     if ($i++ >= $bytesToProcess) { 
      break; 
     } 
     $octets[] = ($value >> 18) & 0x3f; 
    } while ($i < $bytesToProcess); 

    return array_map(function ($i) { 
     return str_pad(base_convert($i, 10, 2), 6, '0', STR_PAD_LEFT); 
    }, $octets); 
} 

var_export(encode64("Man", 3)); 

+0

[ड्रूपल का बंदरगाह] (http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/includes/password.inc#l46) इसे "* * निक्स मानक के रूप में वर्णित करता है क्रिप्ट() " –

उत्तर

1

encode64() सिर्फ मानक बेस 64 के एक कार्यान्वयन जो उलटे क्रम में बिट्स में गिना जाता है और एक अलग चरित्र सेट का उपयोग करता तरह लग रहा है उदाहरण के लिए, पहला आउटपुट चरित्र। यह शायद सिर्फ एक गलती है; इस तरह से ऐसा करने में कोई सुरक्षा या प्रदर्शन लाभ नहीं है (और PHP के मूल base64_encode से संबंधित कुछ प्रदर्शन दोष)।

+0

ऐसा लगता है कि यह दोनों सिरों पर एक बाइट स्वैप कर रहा है: 3 इनपुट बाइट्स के क्रम को उलट दें, उन्हें 6 बिट टुकड़ों में घुमाएं, फिर आउटपुट बाइट्स के क्रम को उलट दें। – Simon

+0

मुझे लगता है कि एक ही प्रभाव होगा, हाँ। किसी भी तरह से यह प्रक्रिया में किसी बिंदु पर एक उलटा है। – duskwuff

0

encode64 का उपयोग करता है (इंगित करने के लिए वास्तव में, जहां प्रत्येक इनपुट बिट ले जाया जाता है अद्यतन) और '/' ए-जेए-जेड -9 के बगल में। बेस 64 '+' और '/' का उपयोग करता है। इसके अलावा '.and'/'नक्शा 0 और 1, जबकि' + 'और'/'नक्शा बेस 64 में 62 और 63 तक है।

यूयूएनकोड अक्षरों के बिना सिस्टम के साथ संगत होने के लिए अक्षरों, अंक, और कई विराम चिह्नों का उपयोग करता है।

मैं एन्कोड 64 से परिचित नहीं हूं। इसका उपयोग करने का एकमात्र कारण यह होगा कि आपके द्वारा उपयोग किए जाने वाले पर्यावरण में '+' की अनुमति नहीं है। लेकिन फिर आप बेस 64 का उपयोग कर सकते हैं और str_replace कर सकते हैं। यदि आप अपनी आँखें सही तरीके से भेंगापन, इसके लिए पिछले 6 पहली बाइट के टुकड़े का चयन है -

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