Пользовательский кодер phpass для base 64: есть ли у него имя / преимущество перед Base64? - PullRequest
5 голосов
/ 15 сентября 2011

phpass использует странный (для меня) алгоритм в encode64 () для кодирования base 64. Base64 и Uuencode линейно порция 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 ]

1 голос
/ 15 сентября 2011

encode64() просто выглядит как реализация стандартного base64, который считает биты в обратном порядке и использует другой набор символов - если вы правильно прищурите глаза, он выбирает последний 6 битпервого байта для первого выходного символа, например.Это, вероятно, просто ошибка;в этом нет никакой выгоды для безопасности или производительности (и некоторые недостатки производительности по сравнению с нативным PHP base64_encode).

0 голосов
/ 15 сентября 2011

encode64 использует '.'и '/' рядом с a-zA-Z0-9.Base64 использует «+» и «/».Также '.' И '/' отображаются на 0 и 1, а '+' и '/' отображаются на 62 и 63 в Base64.

UUencode использует буквы, цифры и много знаков препинания для совместимости с системами без прописных букв.

Я не знаком с encode64.Единственная причина его использования может быть в том случае, если «+» не разрешен в используемой вами среде.Но тогда вы можете просто использовать Base64 и сделать str_replace.

...