首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用urandom生成所有可能的base64字符?

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

Stack Overflow用户
提问于 2016-03-01 12:40:48
回答 1查看 2.4K关注 0票数 0

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

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

64**4 == 2**24

这就是为什么:

代码语言:javascript
运行
复制
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个,还是它会破坏我的随机重分区?

一种解决办法是:

代码语言:javascript
运行
复制
hex(0x123456789012 & 0xFFFFFFFFFF)
'0x3456789012'

另一个:

代码语言:javascript
运行
复制
hex(0x123456789012 >> 8)
'0x1234567890'

你认为如何?

EN

Stack Overflow用户

回答已采纳

发布于 2016-03-02 09:39:09

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

40%6 =4

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35723212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档