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));
(各入力ビットが移動される場所を正確に示すように更新)
[Drupalのポート](http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/includes/password.inc#l46)は、これを「* nix標準からcrypt() " –