2011-09-15 11 views
5

phpass 64 kodlamak temel almak encode64() tuhaf (bana) bir algoritma kullanır. Base64 ve Uuencode, yazdırılabilir bir karaktere eşlemeden önce her sekizli üretmek için 6 bitlik bilyeli yığın. encode64 etrafında bit karıştırır:phpass'ın özel base 64 enkoder: Base64 üzerinde bir adı/avantajı var mı?

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

bu algoritma yaygın bilinen mı? Ve geriye dönük uyumluluğun yanı sıra, neden Base64 üzerinden seçmelisiniz?

Ben algoritma netleştirmek için yeniden yazıldı belirttik: ''

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

[Drupal noktası] (http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/includes/password.inc#l46) dan "* Nix standart olarak tanımlamaktadır crypt()" her iki ucunda da birer bayt takas yapıyor gibi görünüyor bana –

cevap

1

encode64() sadece ters sırada bitlerini sayar ve farklı bir karakter kümesi kullanan standart base64 bir uygulamaya benziyor Örneğin ilk çıktı karakteri. Bu muhtemelen sadece bir hatadır; bu şekilde yapmanın hiçbir güvenlik veya performans yararı (ve PHP doğal base64_encode göre bazı performans dezavantajları) var.

+0

: sonra çıkış bayt sırasını tersine çevirmek, 6 bitlik parçalar halinde, yığın onları 3 giriş bayt sırasını ters. – Simon

+0

Bence bu aynı etkiye sahip olacak, evet. Her iki durumda da süreçte bir noktada tersine dönüyor. – duskwuff

0

encode64 kullanır (her giriş bit taşınır tam olarak nerede göstermek için güncellendi) ve a/zA-Z0-9’un yanında. Base64 '+' ve '/' kullanır. Ayrıca '.' Ve '/' haritasına 0 ve 1, '+' ve '/' ise 64 ile 63.

UUENCODE başkentleri olmayan sistemler ile uyumlu olacak şekilde harfler, rakamlar ve birçok noktalama karakterleri kullanır.

Ben encode64 ile aşina değilim. Kullandığınız ortamda '+' izin verilmiyorsa, kullanmanın tek nedeni. Ama sonra Base64'i kullanabilir ve bir str_replace yapabilirsin. Doğru yolu gözlerini şaşı, eğer ilk bayt son 6 bit seçerek oluyor -

İlgili konular