如何使用urandom生成所有可能的base64字符?

时间:2016-03-01 12:40:49

标签: random cryptography base64

在base64位数字中,您最多可以保存6位(2**6 == 64)。

这意味着您可以在4个base64数字中容纳3个字节。

64**4 == 2**24

这就是原因:

0x000000 == 'AAAA'
0xFFFFFF == '////'

这意味着3个字节的随机字符串相当于4个字符的base64字符串。

但是,如果我在base64字符串中转换多个不是3的倍数的字节,我将无法生成base64字符串的所有组合。

我们举一个例子:

  • 如果我想要一个随机的7个字符的base64字符串,我需要生成42个随机位(64**7 == 2**42)。

如果我使用urandom获得5个随机字节,我将只得到40位(5 * 8),如果要求6,我将获得48位(6 * 8)。

我可以要求6个字节并使用掩码将其缩短为5或者是否会破坏我的随机重新分区?

一个解决方案:

hex(0x123456789012 & 0xFFFFFFFFFF)
'0x3456789012'

另一个:

hex(0x123456789012 >> 8)
'0x1234567890'

您怎么看?

1 个答案:

答案 0 :(得分:0)

base64 字符串,长度为7个字符 是一个5字节的文件编码(40位:不少,不多)

40%6 = 4

base64 需要添加2 more bits,然后添加42 bits42%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