phpass 的自定义 Base 64 编码器:它比 Base64 有名称/优势吗?

发布于 2024-12-04 22:55:52 字数 1851 浏览 1 评论 0原文

phpassencode64() 为 Base 64 编码。 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));

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

phpass uses a strange (to me) algorithm in encode64() to base 64 encode. Base64 and Uuencode linearly chunk 6 bits to produce each octet before mapping to a printable char. encode64 shuffles the bits around:

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

Is this algorithm commonly known? And besides backward compatibility, why choose it over Base64?

Below I've rewritten it to clarify the algorithm:

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

(updated to indicate exactly where each input bit is moved)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放手` 2024-12-11 22:55:52

encode64() 看起来就像标准 Base64 的实现,它以相反的顺序对位进行计数并使用不同的字符集 - 如果您以正确的方式眯起眼睛,它会选择最后一个<例如,/em> 第一个输出字符的第一个字节的 6 位。这可能只是一个错误;这样做没有安全性或性能上的好处(并且相对于 PHP 的本机 base64_encode< /a>)。

encode64() just looks like an implementation of standard base64 which counts bits in the reverse order and uses a different character set -- if you squint your eyes the right way, it's selecting the last 6 bits of the first byte for the first output character, for instance. This is probably just a mistake; there's no security or performance benefit in doing it this way (and some performance drawbacks relative to PHP's native base64_encode).

十年不长 2024-12-11 22:55:52

编码64使用'.'和 a-zA-Z0-9 旁边的“/”。 Base64 使用“+”和“/”。另外,'.' 和 '/' 映射到 0 和 1,而 '+' 和 '/' 映射到 Base64 中的 62 和 63。

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

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

encode64 uses '.' and '/' beside a-zA-Z0-9. Base64 uses '+' and '/'. Also '.'and '/' map to 0 and 1, while '+' and '/' map to 62 and 63 in Base64.

UUencode uses letters, digits, and many punctuation characters to be compatible with systems without capitals.

I'm not familiar with encode64. The only reason for using it would be if '+' is not allowed in the environment that you use. But then you could just use Base64 and do a str_replace.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文