Android генератор случайного числа

Класс Random

Класс java.util.Random представляет собой генератор псевдослучайных чисел.

Класс представлен двумя конструкторами

  • Random() — создаёт генератор чисел, использующий уникальное начальное число
  • Random(long seed) — позволяет указать начальное число вручную

Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.

  • boolean nextBoolean() — возвращает следующее случайное значение типа boolean
  • void nextBytes(byte[] buf) — заполняет массив случайно созданными значениями
  • double nextDouble() — возвращает следующее случайное значение типа double
  • float nextFloat() — возвращает следующее случайное значение типа float
  • synchronized double nextGaussian() — возвращает следующее случайное значение гауссова случайного числа, т.е. значения, центрированное по 0.0 со стандартным отклонением в 1.0 (кривая нормального распределения)
  • int nextInt(int n) — возвращает следующее случайное значение типа int в диапазоне от 0 до n
  • int nextInt() — возвращает следующее случайное значение типа int
  • long nextLong() — возвращает следующее случайное значение типа long
  • synchronized void setSeeD(long seed) — устанавливает начальное значение

Пример для вывода случайного числа.

Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.

При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.

Читайте также:  Андроид пропал иконка камеры

Для генерации 10 чисел типа int используйте код:

Генерация в определённом интервале

Нужны случайные числа от 100 до 200? Пишем код.

Случайные цвета

Работать с числами не слишком интересно. Давайте поработаем со цветом. В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.

Щёлкая по кнопке, вы будете менять её цвет случайным образом.

Лотерея «6 из 49»

Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.

SecureRandom

Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.

Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).

Источник

Шифрование и генерация случайных чисел в Android приложениях. Тестовые примеры

Шифрование данных

Шифрование имеет важное значение, поскольку позволяет скрыть от посторонних глаз то, что им не следует видеть. Мобильные устройства хранят все больше и больше значимой информации, и защитить ее – прямая обязанность каждого разработчика.
Существует два варианта шифрования данных под Android: с использованием Java Crypto API и OpenSSL API (нативный код). Мы рассмотрим оба.

Java Crypto API

Использовать Java Crypto API под Android очень просто. Сначала вам необходимо сгенерировать ключ шифрования. За это отвечает класс KeyGenerator в пэкедже javax.crypto.

Теперь вы можете использовать сгенерированный ключ для шифрования файлов с данными. Для этого зашифруем блоки байтов по алгоритму AES с помощью javax.crypto.

OpenSSL API

Шифрование данных через OpenSSL под Android требует написания нативного кода С, который доступен в Java через вызовы JNI. Это отнимает больше времени, зато быстродействие в результате будет выше.
Для начала сгенерируем ключ и iv.

Читайте также:  Навигатор османд для андроид

Теперь мы можем использовать сгенерированный ключ (cKeyBuffer) для шифрования файла. Инициализируем EVP с помощью вашего ключа и iv. Теперь подаем блоки байтов на вход функции EVP_EncryptUpdate. Последняя порция байтов из вашего файла должна быть скормлена функции EVP_EncryptFinal_ex.

Генерация случайных чисел

Генератор случайных чисел (RNG) – это программа или устройство для производства случайной последовательности чисел на определенном промежутке. RNG является жизненно важным для безопасности приложения. В реальности криптографический протокол может быть очень надежным, но при этом подверженным разнообразным атакам из-за того, что в своей основе использует слабые методы генерации ключа. Для усиления ключа и повышения надежности всей системы в целом может использоваться аппаратная поддержка RNG.

Существует целых 4 способа сгенерировать случайные числа в Android:

  • java.util.random
  • java.security.SecureRandom
  • /dev/urandom
  • OpenSSL API

Однако, если вы используете RNG для генерации ключа, защищающего ваши данные, использовать обычный класс Random не рекомендуется, так его легче всего взломать. Остальные 3 метода обеспечивают более надежную защиту.

java.util.random

Использовать Java Random Number API очень просто. Вызов Random.nextInt() возвратит 4-байтное случайное значение (общее количество возможных значений – 2 32 ). Это API вполне годится для случаев, когда не требуется полагаться на действительно случайные числа.

java.security.SecureRandom

SecureRandom похож на java.util.Random в том смысле, что также возвращает 4-байтовое значение. SecureRandom криптографически более надежен, однако разработчики должны ознакомиться с недавней рекомендацией генерировать затравочную величину с помощью /dev/urandom для SecureRandom перед генерацией случайных чисел. В примере ниже /dev/urandom не используется.

/dev/urandom

Во всех операционных системах семейства Linux, включая Android, имеется специальный файл, созданный ядром, с помощью которого можно предоставить случайные числа приложениям. Среди всех 4 способов этот самый медленный, он генерирует криптографически безопасные значения с высокой энтропией путем объединения шумовых величин из различных частей операционной системы (например, драйверов устройств) для RNG. Мы можем получить случайное число непосредственно из ядра, прочитав файл /dev/urandom. /dev/urandom имеет доступ к аппаратному RNG, если таковой имеется.

Читайте также:  Message logger discord андроид
OpenSSL API

Мы также можем использовать OpenSSL API для получения случайных чисел в нативном коде С. В OpenSSL возможно использование затравочных байт из /dev/urandom для генерации криптографически безопасных случайных чисел. OpenSSL API обратится к аппаратному RNG, если таковой имеется.

Источник

Оцените статью