如何使用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 字符串的所有组合。
举个例子:
- 如果我想要一个随机的 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'
你怎么看?
base64 长度为 7 个字符的字符串
是一个文件的编码,有 5 个字节(40 位:不多不少)
40%6 = 4
base64需要加上2 more bits
,然后,加上42 bits
,42%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
在 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'
你怎么看?
base64 长度为 7 个字符的字符串 是一个文件的编码,有 5 个字节(40 位:不多不少)
40%6 = 4
base64需要加上2 more bits
,然后,加上42 bits
,42%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