Base64编码的512位数字签名的最终字符范围是多少?

时间:2014-01-20 03:42:05

标签: java base64 digital-signature apache-commons ed25519

我通过各种堆栈Q&发现,Base64编码的256位数字将有一个=用于填充,并且只会以AEIMQUYcgkosw048之一结束。

我非常有信心,由于比特商,Base64编码的512位数字将有两个==的填充。

对于Base64编码的512位数字,最终字符的范围是多少?比特商的模数是相同的,那么这意味着256位编码和512位编码的最终字符范围是相同的吗?

这是为了节省空间并重新编写可读的Ed25519签名。


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

1 个答案:

答案 0 :(得分: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

使用哪个字符来表示通过表格指定6比特的比特,参见例如Wikipedia article

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

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

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