Образец кода: приложение для генерации случайных чисел

Download as PDF

Download sample code

Кристофер Бёрд, специалист по разработке программного обеспечения 

Первоисточник приложения:
Intel SSG

Введение

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

Эта статья представляет краткий обзор API случайных чисел и демонстрирует, как использовать разные API для генерации случайных чисел на Android OS.

Мы рекомендуем вам попробовать все возможности и компилировать код по мере прочтения материала.

Код с пояснениями

Существует 4 пути для генерации случайных чисел на Android.

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

Если вы используете ГСЧ для генерации криптографического ключа с целью защиты своих данных, знайте, что типовой класс Random известен своей неустойчивостью ко взлому, и лучше его не использовать. Три остальные подхода точно обеспечат вас мощными ключами. 

java.util.random

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

for (int i = 0; i < lastVal; i += 2) {
	dataRandomPoints[i] = (rand.nextInt() % widget_width);
	dataRandomPoints[i+1] = (rand.nextInt() % widget_height);

}

java.security.SecureRandom

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

SecureRandom srand = new SecureRandom();
shouldDraw = (srand.nextInt() % randomMod );

/dev/urandom

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

unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);

FILE *fin;
strcpy(filein, "/dev/urandom");
fin = fopen(filein, "rb");

if (fin != NULL) {
	fread(cKeyBuffer, sizeof(int), keysize, fin);
	fclose (fin);
}

OpenSSL API

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

int seedbytes = 1024;
unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);

if (!opensslIsSeeded) {

	if (!RAND_load_file("/dev/urandom", seedbytes)) {
		__android_log_print(ANDROID_LOG_ERROR, TAG, "Failed to seed OpenSSL RNG");
		return jKeyBuffer;
	}

	opensslIsSeeded = 1;
}

if (!RAND_bytes((unsigned char *)cKeyBuffer, keysize * sizeof(int))) {
	__android_log_print(ANDROID_LOG_ERROR, TAG, "Faled to create OpenSSSL random integers: %ul", ERR_get_error);
}

Выводы

Внедряя код по образу представленного образца, вы сможете быстро освоить использование четырех путей по генерации случайных чисел.

Об авторе

Кристофер Бёрд является членом Intel Software and Solutions Group (SSG), подразделения Developer Relations и команды Intel® Atom™ High Touch Software Enabling.

Статьи и информация по теме:

Предупреждение

ИНФОРМАЦИЯ В ЭТОМ ДОКУМЕНТЕ ПРЕДОСТАВЛЯЕТСЯ В ОТНОШЕНИИ ПРОДУКТОВ INTEL. ЛИЦЕНЗИЯ, ЯВНАЯ ИЛИ ПОДРАЗУМЕВАЕМАЯ, ПРЕДУСМОТРЕННАЯ ПРОЦЕССУАЛЬНЫМ ПОРЯДКОМ ИЛИ ИНЫМ СПОСОБОМ, НА ЛЮБЫЕ ПРАВА НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ НЕ ПРЕДОСТАВЛЯЮТСЯ ЭТИМ ДОКУМЕНТОМ. ЗА ИСКЛЮЧЕНИЕМ СЛУЧАЕВ, ПРЕДУСМОТРЕННЫХ УСЛОВИЯМИ И СРОКАМИ INTEL ПО ПРОДАЖЕ ПОДОБНЫХ ПРОДУКТОВ, INTEL НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ И ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ В ОТНОШЕНИИ ПРОДАЖИ И/ИЛИ ИСПОЛЬЗОВАНИЯ ПРОДУКТОВ INTEL, ВКЛЮЧАЯ ОБЯЗАТЕЛЬСТВА ИЛИ ГАРАНТИИ, ОТНОСЯЩИЕСЯ К ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ЛИКВИДНОСТИ, ИЛИ НАРУШЕНИЯ КАКИХ-ЛИБО ПАТЕНТОВ, АВТОРСКИХ ПРАВ ИЛИ ИНЫХ ПРАВ ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ.

ЕСЛИ ИНОЕ НЕ СОГЛАСОВАНО КОМПАНИЕЙ INTEL В ПИСЬМЕННОЙ ФОРМЕ, ПРОДУКТЫ INTEL НЕ ПРЕДНАЗНАЧЕНЫ ДЛЯ ЛЮБОГО ИСПОЛЬЗОВАНИЯ, КОТОРОЕ ПРИ НАЛИЧИИ СБОЯ В РАБОТЕ ПРОДУКТА INTEL МОЖЕТ СПРОВОЦИРОВАТЬ ТРАВМИРОВАНИЕ И СМЕРТЕЛЬНЫЙ ИСХОД.

Intel может вносить изменения в спецификации и описания продукции в любое время без уведомления. Проектировщики не должны полагаться на отсутствие или наличие характеристик каких-либо объектов или инструкций с пометками "зарезервировано" или "не определено". Intel сохраняет их для дальнейшего определения и не несет никакой ответственности за конфликты или несовместимость, которые могут возникнуть от будущих изменений. Приведенные здесь сведения могут быть изменены без предварительного уведомления. Не финализируйте проект на базе этой информации.

Продукты, описанные в этом документе, могут содержать конструктивные недостатки или ошибки, которые могут вызвать отклонения в работе продукта от опубликованных спецификаций. Сведения о выявленных недостатках доступны по запросу.

Свяжитесь с вашим локальным офисом продаж Intel или обратитесь к своему дистрибьютору, чтобы получить последние версии спецификаций, а также перед размещением заказа.

Копии документов, имеющих порядковый номер и на которые ссылается данный документ, а также иные материалы Intel можно получить, позвонив по тел. 1-800-548-4725 или на сайте: http://www.intel.com/design/literature.htm

 

Программное обеспечение и рабочая нагрузка, используемые в тестах производительности, могли быть оптимизированы для обеспечения высокой производительности только на микропроцессорах Intel. Тесты производительности, такие как SYSmark* и MobileMark*, проводятся с использованием конкретных компьютерных систем, компонентов, программного обеспечения, операций и функций. Любое изменение любого из этих факторов может привести к варьированию результатов. Вам стоит обратиться к другим источникам информации и тестам производительности для содействия  в оценке принятия решения о покупке, включая аспект производительности этого продукта в совместной работе с другими продуктами.

Любой программный исходный код, использованный в настоящем документе, поставляется по лицензии и может быть задействован или скопирован только в соответствии с условиями этой лицензии.

Intel, логотип Intel и Atom являются товарными знаками Корпорации Intel в США и/или других странах.

Copyright © 2014 Корпорации Intel. Все права защищены.

*Другие наименования и торговые марки могут быть собственностью других людей. 

 

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.