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

How to use urandom to generate all possible base64 characters?

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

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

64**4 == 2**24

这就是为什么:

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

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

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

举个例子:

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

我能否请求 6 个字节并使用掩码将其缩短为 5 个字节,否则它会破坏我的随机重新分区吗?

一个解决方案:

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

另一个:

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

你怎么看?

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

40%6 = 4

base64需要加上2 more bits,然后,加上42 bits42%6=0, 编码是可能的;但是,请注意:

" If I want a random 7 characters base64 string, I would need to generate 42 random bits (64**7 == 2**42). "

这2个附加位不是随机的,而是常量;确实是零。

您的密钥的基数-space没有改变:是2**40 = 1099511627776,不是(64**7 == 2**42)

(64**7 == 2**42)是key的基数-space包含长度为7的64个字符的所有可能组合;但是,由于最后两位固定(在本例中为零,但值无关紧要),您没有所有可能的组合。

6个随机字节(48位),或42个随机位,增加你原来的密钥-space;你应该使用 5 个随机字节(40 位),并将其发送到 base64