首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不削弱熵的情况下将随机字节转换成数字块?

如何在不削弱熵的情况下将随机字节转换成数字块?
EN

Cryptography用户
提问于 2020-06-20 16:31:52
回答 2查看 614关注 0票数 0

假设您有一个,或几个随机字节(S) 0-255,并且希望一次导出0-9的数字,Pad (OTP)。

在不削弱基本安全性的情况下,将256个可能的值表示为10个可能值的非天真方法是什么?我不确定我是否可以简单地丢弃256值中的6种状态,以达到10的除法,而不会同时削弱安全性。

有没有一种简单而又令人信服的数学方法,我可以将自己移植到一种编程语言,将字节映射成从0到9不等的数字块?

EN

回答 2

Cryptography用户

回答已采纳

发布于 2020-06-20 20:27:32

是的,这被称为简单的丢弃方法或排除抽样。基本上,您生成一个随机字节,然后检查该值是否等于或高于250 (最高倍数为10)。如果是这样,则放弃值并重新生成字节。如果在范围内有一个值[0,250),那么只需使用模10 (除后的余数)。你就在这里,一个分布良好、安全可靠的价值。

当然,这种方法对于一次性衬垫来说并不是很有效.通常,一次性衬垫是在位上使用的.但是,如果它超过了数字,那么就更容易使用10到您需要的数字的幂,然后使用简单的丢弃方法来生成更大的值,然后执行(可选的)模块缩减。如果只使用足够的位数,则不需要模块缩减。生成二进制值之后,可以执行基本转换,将二进制值转换为数字。

如果您认为第二种方法仍然不够有效,那么您可以使用我是作者的优化简单丢弃法

请注意,许多库都有在范围内创建大随机数的方法,以及获取十进制字符串的方法,因此在这种情况下,您可以在两个调用中检索所有所需的随机数字(尽管您可能必须将字符串转换为表示每个数字的整数中的值)。

票数 4
EN

Cryptography用户

发布于 2020-06-20 20:37:16

可以有多种解决方案。

  1. 使用每个字节的十进制表示。要从0-9流恢复原始字节流,每个0-9表示形式应该包含准确的3个符号,即,对于小于100的数字使用前导零。这一转变看起来如下:
  • 00000000 -> 000
  • 00000001 -> 001
  • 00000010 -> 002
  • 00000011 -> 003
  • ..。
  • 00100000 -> 032
  • ..。
  • 11111111 -> 255

每个数字的频率不相等,0和1的频率最高,然后是2,然后是所有其他数字。但这不会改变这些0-9编码所代表的原始数据的熵。

这种方法的优点是一次转换一个字节就足够了。一次恢复字节3位数字就足够了。

  1. 使用每4位的十进制表示。
  • 0000 -> 00
  • 0001 -> 01
  • 0010 -> 02
  • 0011 -> 03
  • ..。
  • 1010 -> 10
  • ..。
  • 1111 -> 15

因此,每个字节将用4位数字0-9表示.

其优点与整个字节的情况相同:对于编码而言,一次需要一个字节,解码2位数为0-9。缺点是,结果将需要更多的空间,每字节4位,而不是3位。

  1. 您可以使用字节组,例如,将每2个字节或每8个字节视为十进制数。别忘了领头零。

然而,这样的字节组将有一个缺点,您需要使用填充。例如,如果使用8字节组,而最后一组小于8字节,则需要额外字节才能生成8组。

票数 1
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/81466

复制
相关文章

相似问题

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