3

目前,我正在寻找一种方法来提高我的应用程序(纸牌游戏)中的随机性质量。Android以前,估计对于我的情况(52!排列)至少需要 226 位熵(226 随机位)。

我打算用它byte[]作为种子SecureRandom

SecureRandom random = new SecureRandom();
random.setSeed(/* insert seed here, byte[] */)

问题是——我在哪里可以可靠地获得这个数量(至少 226 位)的随机位Android,最好不需要任何权限并且没有互联网。此外,无论设备和 API 级别如何,它都应该可以工作。

4

2 回答 2

3

在 Java 8+ 上,您可以使用

SecureRandom rand = SecureRandom.getInstanceStrong();

在您的平台上获得最强的随机性。明确地说,您可以使用

SecureRandom rand = SecureRandom.getInstance("NativePRNGBlocking");

/dev/random它使用类似 Linux 的系统上的熵。但是,我希望如果不可用它会失败。

https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/


或者

System.nanoTime()您可以通过采用 SHA256 或更高的先前事件来根据用户的输入创建随机性。

于 2018-08-10T13:29:13.300 回答
1

在无法访问麦克风(需要权限)或从中获取字节random.org(需要互联网)的情况下,我唯一能想到的是用户他/她自己:呈现一个空白方块,用户将手指移过,指示他们尽可能随机地进行操作,最好是几秒钟,并使用该触摸数据。(我似乎记得我曾经使用过的一个应用程序——TrueCrypt?——就是这样做的。)你甚至可以在他们的人类随机性之上加上一些伪随机性,以试图避免人们用极其精确的可重复动作来玩这个系统。

如果您稍微放宽您的要求,您可能会从麦克风(环境噪声)和/或加速度计中获得一些相当不错的熵。当然,如果您请求网络访问,您可以从http://random.org下载真正随机的数据。

于 2018-08-10T13:23:47.233 回答