В настоящее время я ищу способ увеличить качество случайности в моем приложении Android
(карточная игра). Ранее предполагалось, что для моей ситуации (52! Перестановки) требуется не менее 226 бит энтропии (226 случайных битов).
Я планирую использовать этот byte[]
как семя для SecureRandom
:
SecureRandom random = new SecureRandom();
random.setSeed(/* insert seed here, byte[] */)
Вопрос в том - Где я могу надежно получить случайные биты в таком количестве (не менее 226 бит) на Android
, желательно без каких-либо разрешений и без интернета. Кроме того, он должен работать независимо от устройства и уровня API.
random.org
или аналогичный ...
@KlingKlang - Но я ищу ответ специально для Android. Неправильно ли это заявить в названии?
НЕТ. ярлык достаточно.
@KlingKlang - Хорошо, спасибо за руководство ..
наверное глупо, а как насчет двух экземпляров UUID.randomUUID().toString().getBytes();
?
Не за что....
Думаю, для игры это практически не актуально. Чтобы увидеть повтор, нужно сыграть в миллиарды игр.
SecureRandom
использует /dev/random
в Linux и, скорее всего, Android.
@Eugene - Это будет псевдослучайная, а не настоящая энтропия.
@ T.J. Crowder хороший замечание! Спасибо
Какой смысл иметь "настоящую" случайность? Особенно в игре (связанной? stackoverflow.com/questions/426821/…)
Не имея возможности получить доступ к микрофону (для чего потребуются разрешения) или захватить байты из random.org
(для чего потребуется Интернет), единственное, что я могу придумать, это сам пользователь: представьте пустой квадрат, по которому пользователь перемещает палец. , инструктируя их делать это как можно более случайным образом, в идеале в течение нескольких секунд, и использовать эти сенсорные данные. (Кажется, я припоминаю приложение, которое я использовал - TrueCrypt? - это делало.) Вы можете даже добавить некоторую псевдослучайность поверх их человеческой случайности, чтобы попытаться избежать того, чтобы люди играли в систему с чрезвычайно точными повторяемыми движениями.
Если вы немного ослабите свои требования, вы, вероятно, сможете получить неплохую энтропию от микрофона (окружающий шум) и / или акселерометра. И, конечно же, если вы запрашиваете доступ к сети, вы можете загружать действительно случайные данные из http://random.org.
Если они не заботятся о разрешениях, получение байтового потока с микрофона или данных ACCELEROMETER, а затем добавление его к псевдослучайному числу, похоже, сработает.
Очень хороший момент, возможно, я мог бы генерировать случайные байты на основе действий в предыдущем раунде игры ..
На 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/
Альтернативно
Вы можете создать случайность на основе ввода пользователя, взяв SHA256 или выше из System.nanoTime()
предыдущих событий.
Пожалуйста, не повторяйте android ярлык в заглавие.