2011-09-15 10 views
5

phpassは、encode64()で奇妙な(私にとっては)アルゴリズムを使用して、64エンコードをベースにしています。 Base64およびUuencodeは、印刷可能なcharにマッピングする前に、各オクテットを生成するために6ビットを線形にチャンクします。 encode64は、周りのビットをシャッフル:phpassのカスタムベース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のポート](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を実行することができます。

関連する問題