1

我通过各种堆栈问答发现 Base64 编码的 256 位数字将有一个=用于填充,并且仅以AEIMQUYcgkosw048.

我相当有信心,==由于位商,Base64 编码的 512 位数字将有两个 s 的填充。

对于 Base64 编码的 512 位数字,最后一个字符的范围是多少?位商的模数相同,这是否意味着 256 位编码和 512 位编码的最终字符范围相同?

这是为了节省空间和对可读的 Ed25519 签名进行正则表达式。


具体来说,我正在将 Java 转换byte[64]Stringswith org.apache.commons.codec.binary.Base64encodeBase64

4

1 回答 1

1

我在这里假设所讨论的256 位512 位数字分别使用 32 或 64 字节进行编码(即没有丢弃前导零,没有额外的位来防止有符号/无符号问题,没有 ASN.1 BER 编码头, ...)。

Base64 对每个字节三元组使用 4 个字符,每个字符代表 6 位数据:

        byte #1    |    byte #2    |    byte #3
bit 7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0

变成

bit 5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0
      char #1  |  char #2  |  char #3  |  char #4

哪个 char 用于哪个 6 元组位是通过表格指定的,参见例如Wikipedia 文章

因此,在256 位数字的情况下,必须对 32 个字节进行编码,即使用 11 个四位字符,其中最后一个仅编码 2 而不是最大的 3 个字节,即只有 16 位数据。因此,最后一个字符(没有数据)是 a =,倒数第二个字符(只有前 4 位的数据)只能是一个代表 6 个元组的位和两个最低位为0,即你列举的字符。

512 位数字的情况下,必须编码 64 个字节,即使用 22 个四位字符,最后一个仅编码 1 而不是最大的 3 个字节,即只有 8 位数据。因此,最后两个字符(没有数据)都是=,而第二个字符(只有前 2 位的数据)只能是一个表示 6 元组的位,最低的 4 位是0,即字符AQgw

不过,如上所述,我对数字的编码做了一些假设......

于 2014-01-22T09:07:05.787 回答