在base64位数字中,您最多可以保存6位(2**6 == 64
)。
这意味着您可以在4个base64数字中容纳3个字节。
64**4 == 2**24
这就是原因:
0x000000 == 'AAAA'
0xFFFFFF == '////'
这意味着3个字节的随机字符串相当于4个字符的base64字符串。
但是,如果我在base64字符串中转换多个不是3的倍数的字节,我将无法生成base64字符串的所有组合。
我们举一个例子:
64**7 == 2**42
)。如果我使用urandom获得5个随机字节,我将只得到40位(5 * 8),如果要求6,我将获得48位(6 * 8)。
我可以要求6个字节并使用掩码将其缩短为5或者是否会破坏我的随机重新分区?
一个解决方案:
hex(0x123456789012 & 0xFFFFFFFFFF)
'0x3456789012'
另一个:
hex(0x123456789012 >> 8)
'0x1234567890'
您怎么看?
答案 0 :(得分:0)
base64 字符串,长度为7个字符 是一个5字节的文件编码(40位:不少,不多)
40%6 = 4
base64 需要添加2 more bits
,然后添加42 bits
,42%6=0
,
编码是可能的;但是,要注意:
“如果我想要一个随机的7个字符的base64字符串,我需要 生成42个随机位
(64**7 == 2**42)
。 “
2个附加位不是随机的,而且是常量;确实是零。
密钥空间的基数不会改变:2**40 = 1099511627776
,而不是(64**7 == 2**42)
。
(64**7 == 2**42)
是密钥空间的基数,包含64个字符长度为7的所有可能组合;但是,最后两位固定(在这种情况下为零,但与值无关),您没有所有可能的组合。
6个随机字节(48位)或42个随机位,增加原始密钥空间;你应该使用5个随机字节(40位),并将其发送到 base64