Ste*_*lay 5 php algorithm base64 encoding bit-manipulation
phpass在encode64()中使用奇怪的(对我来说)算法来进行64位编码.在映射到可打印的char之前,Base64和Uuencode线性地将6位打包以产生每个八位字节. encode64洗牌:
input bit location: abcdefgh ijklmnop qrstuvwx
base64 bit location: ..abcdef ..ghijkl ..mnopqr ..stuvwx
encode64 bit location: ..cdefgh ..mnopab ..wxijkl ..qrstuv
Run Code Online (Sandbox Code Playgroud)
这个算法是众所周知的吗?除了向后兼容性,为什么选择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));
Run Code Online (Sandbox Code Playgroud)
(更新以准确指示每个输入位的移动位置)
小智 2
encode64()看起来就像标准 base64 的实现,它以相反的顺序计算位并使用不同的字符集 -例如,如果您以正确的方式眯起眼睛,它会为第一个输出字符选择第一个字节的最后6 位。这可能只是一个错误;这样做没有安全性或性能上的好处(并且相对于 PHP 的本机有一些性能缺陷base64_encode)。
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |