3

URL でフグの暗号化された文字列を渡し、それを base64 のようにエンコードしたいのですが、特殊文字がなければ、base62 のようなものが最適です (0-9a-zA-Z)。だから私がしようとしているのは、base64_encode を使用してフグの暗号化された文字列を変換し、base64 を base62 に変換することです。

base64 を URL セーフにする方法については知っていますが、文字列に特殊文字を入れたくありません。convert_base() は 36 までの基数でのみ機能し、数学拡張機能は基数 62 まで変換できます。

PHP を使用して base64 文字列を base62 に変換する方法を知っている人はいますか?

4

3 に答える 3

4
function base62encode($data) {
    $outstring = '';
    $l = strlen($data);
    for ($i = 0; $i < $l; $i += 8) {
        $chunk = substr($data, $i, 8);
        $outlen = ceil((strlen($chunk) * 8)/6); //8bit/char in, 6bits/char out, round up
        $x = bin2hex($chunk);  //gmp won't convert from binary, so go via hex
        $w = gmp_strval(gmp_init(ltrim($x, '0'), 16), 62); //gmp doesn't like leading 0s
        $pad = str_pad($w, $outlen, '0', STR_PAD_LEFT);
        $outstring .= $pad;
    }
    return $outstring;
}

function base62decode($data) {
    $outstring = '';
    $l = strlen($data);
    for ($i = 0; $i < $l; $i += 11) {
        $chunk = substr($data, $i, 11);
        $outlen = floor((strlen($chunk) * 6)/8); //6bit/char in, 8bits/char out, round down
        $y = gmp_strval(gmp_init(ltrim($chunk, '0'), 62), 16); //gmp doesn't like leading 0s
        $pad = str_pad($y, $outlen * 2, '0', STR_PAD_LEFT); //double output length as as we're going via hex (4bits/char)
        $outstring .= pack('H*', $pad); //same as hex2bin
    }
    return $outstring;
}

$str62 = base62_encode(base64_decode($str64)) // $str64 = our string base64 encoded

すべてのクレジットはMarcus Bointon.

于 2013-08-03T13:31:19.140 に答える
1

以下は、base64 をまったく使用せずに正常に動作するようです。

gmp_strval( gmp_init( bin2hex('myencryptedstring'), 16), 62);
于 2013-08-03T13:45:03.407 に答える