假设您有一个,或几个随机字节(S) 0-255,并且希望一次导出0-9的数字,Pad (OTP)。
在不削弱基本安全性的情况下,将256个可能的值表示为10个可能值的非天真方法是什么?我不确定我是否可以简单地丢弃256值中的6种状态,以达到10的除法,而不会同时削弱安全性。
有没有一种简单而又令人信服的数学方法,我可以将自己移植到一种编程语言,将字节映射成从0到9不等的数字块?
发布于 2020-06-20 20:27:32
是的,这被称为简单的丢弃方法或排除抽样。基本上,您生成一个随机字节,然后检查该值是否等于或高于250 (最高倍数为10)。如果是这样,则放弃值并重新生成字节。如果在范围内有一个值[0,250),那么只需使用模10 (除后的余数)。你就在这里,一个分布良好、安全可靠的价值。
当然,这种方法对于一次性衬垫来说并不是很有效.通常,一次性衬垫是在位上使用的.但是,如果它超过了数字,那么就更容易使用10到您需要的数字的幂,然后使用简单的丢弃方法来生成更大的值,然后执行(可选的)模块缩减。如果只使用足够的位数,则不需要模块缩减。生成二进制值之后,可以执行基本转换,将二进制值转换为数字。
如果您认为第二种方法仍然不够有效,那么您可以使用我是作者的优化简单丢弃法。
请注意,许多库都有在范围内创建大随机数的方法,以及获取十进制字符串的方法,因此在这种情况下,您可以在两个调用中检索所有所需的随机数字(尽管您可能必须将字符串转换为表示每个数字的整数中的值)。
发布于 2020-06-20 20:37:16
可以有多种解决方案。
每个数字的频率不相等,0和1的频率最高,然后是2,然后是所有其他数字。但这不会改变这些0-9编码所代表的原始数据的熵。
这种方法的优点是一次转换一个字节就足够了。一次恢复字节3位数字就足够了。
因此,每个字节将用4位数字0-9表示.
其优点与整个字节的情况相同:对于编码而言,一次需要一个字节,解码2位数为0-9。缺点是,结果将需要更多的空间,每字节4位,而不是3位。
然而,这样的字节组将有一个缺点,您需要使用填充。例如,如果使用8字节组,而最后一组小于8字节,则需要额外字节才能生成8组。
https://crypto.stackexchange.com/questions/81466
复制相似问题