我正在寻找一种在智能手机上生成真正随机位/数字的方法
创建一个自定义TRNG似乎很棘手,很多人建议相信现有的,经过广泛测试和批准。
但我发现Jericho Comms,它使用图片中的自定义TRNG作为输入
这有多安全,强大和可靠?它是否是生成真正随机数/位的有效方法?
我知道智能手机相机并不是完美的,因为JPEG压缩和低质量...但省略了这一点,提出的算法有多正确?
我粘贴文档:
此过程描述了完整的算法:
将用户的照片加载到内存中,并将其存储在RGB值的连续数组中。 获取每个像素的红色,绿色和蓝色(RGB)整数值。对于每种颜色,这将返回0到255之间的数字。 依次删除重复的黑色(0,0,0)像素,白色(255,255,255)像素和完全相同的像素颜色。这将删除具有曝光不足像素,过度曝光像素和具有很少熵的像素的部分。通常,除非存在硬件故障,或者照片的部分曝光不足/过度曝光,否则相邻像素的颜色完全相同是非常罕见的。通常在高质量照片中,在约束像素中至少存在非常轻微的颜色变化。此步骤将删除这些低熵区域。 估计每组RGB值的1位输入熵(每24位像素1位)。这是一个非常保守的估计。用户可以在TRNG设置中将其增加到每像素3位,这将考虑每种颜色的最低有效位中的熵。 收集512个RGB值以获得512位的估计熵输入。 将512 RGB值转换为十六进制表示形式,并将其输入到512位输出的加密哈希值中。用户可以选择使用哪个哈希,程序允许使用Skein或Keccak [c = 2d]。两者都是来自NIST哈希函数竞争的非常强大的决赛算法。将此位的512位哈希输出存储为下一个哈希值。 开始循环:
- 检查新哈希是否有足够的新输入熵,或者突破循环 - 从早些时候获得临时种子 - 获得一组512个RGB值(512位)作为新的输入熵 - 将种子和输入熵连接在一起并使用哈希(种子||输入熵)散列它们 - 将哈希输出的前256位附加到输出随机数据 - 将临时种子更新为散列输出的最后256位 - 返回循环开始。
重要的是要注意,程序不使用这个收集的熵来为伪随机数生成器播种以提供无限量的随机数据。该程序旨在成为一个真正的随机数发生器,因此只需要质量随机性,并且每个均匀随机位必须仅用于加密明文的一位。它假设大多数伪随机数发生器甚至延伸熵的CSPRNG都会在输出中产生微妙的偏差,并允许NSA或其他政府解密部分或全部信息。通过该程序,目标是避免将可用熵拉伸到更多位。