我通过各种堆栈Q&发现,Base64编码的256位数字将有一个=
用于填充,并且只会以AEIMQUYcgkosw048
之一结束。
我非常有信心,由于比特商,Base64编码的512位数字将有两个==
的填充。
对于Base64编码的512位数字,最终字符的范围是多少?比特商的模数是相同的,那么这意味着256位编码和512位编码的最终字符范围是相同的吗?
这是为了节省空间并重新编写可读的Ed25519签名。
具体来说,我正在使用org.apache.commons.codec.binary.Base64
的encodeBase64
将Java byte[64]
转换为Strings
。
答案 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
。
如上所述,我对数字的编码做了一些假设......