phpass的自定义base 64编码器:它是否比Base64具有名称/优势?

时间:2011-09-15 17:41:14

标签: php algorithm encoding base64 bit-manipulation

phpassencode64()中使用奇怪的(对我来说)算法来进行64位编码。在映射到可打印的char之前,Base64Uuencode线性地将6位用于生成每个八位字节。 encode64改变了一些东西:

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));

(更新以准确指示每个输入位的移动位置)

2 个答案:

答案 0 :(得分:1)

encode64()看起来像标准base64的实现,它以相反的顺序计数位并使用不同的字符集 - 如果你以正确的方式眯起眼睛,那就选择 last 6位。这可能只是一个错误;以这种方式执行它没有安全性或性能优势(以及与PHP的本机base64_encode相关的一些性能缺陷)。

答案 1 :(得分:0)

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

UUencode使用字母,数字和许多标点字符与没有大写字母的系统兼容。

我不熟悉encode64。使用它的唯一原因是在您使用的环境中不允许使用“+”。但是你可以使用Base64并执行str_replace。