1

我尝试在 Go 中实现 Drupal 兼容的身份验证并将此包用于 base64 编码:golang.org/src/encoding/base64/base64.go

结果:创建的和在 Drupal 中保存的哈希不匹配。只有在重新实现 Go 的 base64 包之后,我才像在 Drupals base64Encode() 中那样进行位移,哈希匹配:

input bit location:                 abcdefgh ijklmnop qrstuvwx
Go's base64.go bit location:        ..abcdef ..ghijkl ..mnopqr ..stuvwx
PHP's base64Encode() bit location:  ..cdefgh ..mnopab ..wxijkl ..qrstuv

好吧,我这样做而不是谷歌的实现:

...

for si < n {
            // Convert 3x 8bit source bytes into 4 bytes
            val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])

            dst[di+0] = enc.encode[val>>18&0x3F]
            dst[di+1] = enc.encode[val>>12&0x3F]
            dst[di+2] = enc.encode[val>>6&0x3F]
            dst[di+3] = enc.encode[val&0x3F]

            si += 3
            di += 4
        }

...

我自己的实现现在代表 Drupal 的 base64Encode()

...

for si < n {
        // Convert 3x 8bit source bytes into 4 bytes
        // val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])
        val := uint(src[si+0]) | uint(src[si+1])<<8 | uint(src[si+2])<<16

        dst[di+0] = enc.encode[val&0x3F] 
        dst[di+1] = enc.encode[val>>6&0x3F]
        dst[di+2] = enc.encode[val>>12&0x3F]
        dst[di+3] = enc.encode[val>>18&0x3F]

        si += 3
        di += 4
    }

...

我的问题:

  • Go 中是否已经有像我一样的实现(重新实现 Drupal 的 base64Encode())?
  • 这种特殊的base64编码有名字吗?有文献/出版物参考吗?
4

0 回答 0