2011-09-15 25 views
5

phpassencode64()使用一個奇怪的(對我)算法來進行64位編碼。 Base64Uuencode線性組塊6比特在映射到可打印字符之前產生每個八位字節。 encode64洗牌周圍的位:phpass的定製base 64編碼器:它是否比Base64有名稱/優勢?

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

這是算法俗稱?除了向下兼容性,爲什麼選擇它Base64

下面我重寫它澄清算法:「」

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's port](http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/includes/password.inc#l46)將此描述爲「* nix標準crypt()「 –

回答

1

encode64()只是看起來像標準的base64的實現,其對以相反的順序位,並使用不同的字符集 - 如果你眯着眼睛以正確的方式,它選擇的第一個字節的最後 6位的例如第一個輸出字符。這可能只是一個錯誤;這樣做沒有安全性或性能優勢(以及相對於PHP本機base64_encode的性能缺陷)。

+0

它看起來像是在兩端進行字節交換:顛倒3個輸入字節的順序,將它們分塊爲6位,然後顛倒輸出字節的順序。 – Simon

+0

我認爲這會有同樣的效果,是的。無論哪種方式,這在過程中的某個時刻都是逆轉。 – duskwuff

0

encode64使用和'/'在a-zA-Z0-9旁邊。 Base64使用'+'和'/'。 ''和'/'映射到0和1,而'+'和'/'映射到Base64中的62和63。

UUencode使用字母,數字和許多標點符號來與無大寫字母的系統兼容。

我對encode64不熟悉。如果在您使用的環境中不允許使用「+」,則使用它的唯一原因是。但是,你可以使用Base64並執行str_replace。