在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'你认为如何?
发布于 2016-03-02 09:39:09
长度为7个字符的base64字符串是具有5个字节的文件的编码( 40位:不少于,不多)
40%6 =4
base64需要添加2 more bits,然后,使用42 bits、42%6=0,可以实现编码;但是,请注意:
“如果我想要一个随机的7个字符的base64字符串,我需要生成42个随机位
(64**7 == 2**42)。”
这两个额外的位不是随机的,而且是常量;确实是零。
键空间的基数不变:是2**40 = 1099511627776,而不是(64**7 == 2**42)。
(64**7 == 2**42)是键空间的基数,它包含长度为7的64个字符的所有可能组合;但是,由于最后两个位固定(在本例中为零,但值并不重要),您没有所有可能的组合。
6随机字节(48位),或42随机比特,增加原来的密钥空间;您应该使用5个随机字节(40位),并将其发送到base64。
https://stackoverflow.com/questions/35723212
复制相似问题