Использование новых инструкций шифрования Intel® стандарта AES в Android*

Введение

В этой статье описывается поддержка новых инструкций шифрования Intel® стандарта AES (Intel® AES-NI) в Android: что это, как это использовать и как измерять производительность. Также описывается модель использования и примеры в сочетании с двумя сценариями шифрования, демонстрирующими применение инструкций Intel AES-NI. Опытные разработчики могут пропустить первые четыре части этой статьи и перейти сразу к последней части, чтобы ознакомиться со сценариями использования. Менее опытным разработчикам, пожалуй, стоит прочесть всю статью.

Содержание

Введение
Новые инструкции шифрования стандарта AES (Intel AES-NI)
Проверка поддержки Intel AES-NI в Android
Использование Intel AES-NI в Android
 Использование библиотеки ассемблера
 Использование OpenSSL
Измерение производительности
 Средства тестирования
 Результаты тестирования
 Результаты теста, проведенного с помощью самодельной программы
Сценарии использования Intel AES-NI
Сводка
Об авторах
Справочные материалы

Новые инструкции шифрования стандарта AES (Intel AES-NI)

Инструкции Intel AES-NI были предложены в марте 2008 г. в качестве расширения набора инструкций архитектуры х86 для микропроцессоров Intel и AMD. Цель этого набора инструкций состоит в увеличении скорости приложений, выполняющих шифрование и расшифровку данных по стандарту AES.

Инструкции Intel AES-NI перечислены в таблице 1.

Таблица 1. Инструкции Intel® AES-NI

ИнструкцияОписание
AESENCВыполняет один цикл потока шифрования AES
AESENCLASTВыполняет последний цикл потока шифрования AES
AESDECВыполняет один цикл потока расшифровки AES
AESDECLASTВыполняет последний цикл потока расшифровки AES
AESKEYGENASSISTПомогает при создании раундового ключа AES
AESIMCПомогает с инверсными смешанными столбцами AES
PCLMULQDQУмножение

Проверка поддержки Intel AES-NI в Android

Проверить, поддерживается ли Intel AES-NI той или иной платформой, можно с помощью CPUID; проверьте значение CPUID.01H:ECX.AESNI[bit 25] = 1. Также можно использовать функцию check_for_aes_instructions из образца библиотеки Intel AES-NI.

Использование Intel AES-NI в Android

Использовать Intel AES-NI в Android можно разными способами:

  • • написать код C/C++ и использовать код ассемблера напрямую
  • • использовать существующую стороннюю библиотеку, например, OpenSSL*
  • • использовать API Java* Crypto из состава Android Kitkat

TДля компиляции собственной библиотеки/приложения для x86 в ОС Android требуется подготовить автономную цепочку инструментов с помощью команды make-standalone-toolchain.sh в Android NDK:

	$NDK_PATH/build/tools/make-standalone-toolchain.sh –install-dir=$STANDALONE_TOOCHAIN_PATH –toolchain=x86-4.8 –platform=android-14 –ndk-dir=$NDK_PATH
	export PATH=$PATH:$STANDALONE_TOOCHAIN_PATH

Использование библиотеки сборки

Библиотека находится в папке intel_aes_lib. Также ее можно загрузить по адресу http://software.intel.com/en-us/articles/download-the-intel-aesni-sample-library. Используйте GCC версии 4.4 или более поздней, то есть версия NDK должна быть новее, чем NDK v3. (Здесь мы используем android-ndk-r9 для тестирования.)

makefile/shell скрипт для сборки версий под Android отсутствует. Для компиляции можно изменить файл mk_lnx86.sh. Основное изменение состоит в использовании $STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-gcc вместо GCC по умолчанию. Также следует использовать параметры pass –D__ANDROID__.

	export CC=”$STANDALONE_TOOLCHAIN_PATH/bin/i686-linux-android-gcc –D__ANDROID__  --sysroot=$STANDALONE_TOOLCHAIN_PATH/sysroot -I$STANDALONE_TOOLCHAIN_PATH/sysroot/include”

После компиляции можно перенести двоичную исполняемую программу в Android и протестировать ее. Также можно использовать исходный код непосредственно в ваших приложениях или использовать созданную двоичную библиотеку в NDK.

Использование OpenSSL

Инструкции Intel AES-NI используются многими библиотеками, например crypto++ polar SSL IPP OpenSSL и другими. (Мы используем OpenSSL в качестве эталона — поддерживаемые в OpenSSL инструкции Intel AES-NI из экспериментальной версии 1.0).

Начиная с Android 4.3, в OpenSSL в AOSP присутствует поддержка Intel AES-NI, поэтому вам достаточно скомпилировать код с нужной конфигурацией. Также можно загрузить его с официального веб-сайта и скомпилировать самостоятельно, а затем использовать файл *.a/*.so напрямую в вашем проекте.

1) Загрузка ‒ можно загрузить OpenSSL по адресу http://www.openssl.org/source/. В настоящее время в Android 4.2 используется openssl-1.0.1c а в Android 4.4 — openssl-1.0.1e.Нужно использовать такую же версию OpenSSL, как в целевой системе.

(2) Компиляция — выполните следующую команду в консоли:

	cd $OPENSSL_SRC_PATH
	export CC=”$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-gcc –mtune=atome –march=atom –sysroot=$STANDALONE_TOOCHAIN_PATH/sysroot”
	export AR=$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-ar
	export RANLIB=$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-ranlib
	./Configure android-x86 –DOPENSSL_IA32_SSE2 –DAES_ASM –DVPAES_ASM
	make

После этого файл libcrypto.a появится в папке верхнего уровня. Для использования файла *.so введите “Configure shared android-x86 ***”.

(3)Используйте OpenSSL через NDK в проекте Android: создайте проект Android, объявите связанную с OPENSSL функцию как нативную, затем используйте код в jni/*.c.

После этого нужно скопировать файлы *.a/*.so и файл заголовка в проект.

	mkdir jni/pre-compiled/
	mkdir jni/include
	cp $OPENSSL_PATH/libcrypto.a jni/pre-compiled
	cp –L -rf $OPENSSL_PATH/include/openssl jni/include

Затем добавьте следующую строку в файл jni/Android.mk:

	…
	LOCAL_MODULE	:=	static
	LOCAL_SRC_FILES	:=	pre-compiled/libcrypto.a
	…
	LOCAL_C_INCLUDES	:=	include
	LOCAL_STATIC_LIBRARIES	:=	static –lcrypto
	…

Затем можно использовать функции, предоставленные в OpenSSL, для реализации ваших функций encrypt/decrypt/SSL. Чтобы использовать Intel AES-NI, используйте функцию серии EVP_*, как показано ниже. При этом аппаратный модуль Intel AES-NI будет автоматически задействован для шифрования и расшифровки AES, если ЦП это поддерживает.

	//declare
EVP_CIPHER_CTX en, de;
	//init
	EVP_CIPHER_CTX_init(&en);
	EVP_CIPHER_CTX_init(&de);
	EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL);
	//decrypt & encrpyt
	EVP_DecryptUpdate(&de, plaintext, &bytes_written, ciphertext, len);
	EVP_EncryptUpdate(&en, ciphertext, &cipher_len, plaintext, len);
	//clean up
	EVP_CIPHER_CTX_cleanup(&en);
	EVP_CIPHER_CTX_cleanup(&de);

Затем используйте ndk-build для компиляции.

	ndk-build APP_ABI=x86

(4) Использование API Java Crypto: в Android Kitkat поставщик OpenSSL с именем “AndroidOpenSSL” поддерживает Intel AES-NI, поэтому вы можете использовать javax.crypto.Cipher напрямую.

Cipher cipher = Cipher.getInstance(AES_ALGORITHM, “AndroidOpenSSL”);
cipher.init(*);

Performance Measurement

Измерение производительности

Средства тестирования

(1) Используйте средства OPENSSL. Команда openssl в составе OpenSSL может выполнять множество задач. Ее можно применять для измерения производительности с помощью openssl speed. По умолчанию openssl ((при сборке с параметром AES_ASM) будет автоматически использовать аппаратное ускорение Intel AES-NI. Также можно без труда отключить аппаратное ускорение, задав одной переменной среды: OPENSSL_ia32cap значение ~0x200000200000000

	openssl speed –evp aes-256-cbc
	OPENSSL_ia32cap=~0x200000200000000 openssl speed –evp aes-256-cbc

(2) Используйте самодельную программу.


Рисунок 1. Созданная нами тестовая программа.

(3) Intel® Mobile Platform Monitor (Intel® MPM) — это средство отслеживания электропотребления для получения подробной информации о состоянии ЦП/ГП/питания и т. п. Дополнительные сведения см. по адресу http://software.intel.com/en-us/articles/intel-power-monitoring-tool-for-android-devices-a-power-and-performance-related-data


Рисунок 2. Программа Intel® MPM

stop profiling, затем сохраните данные резуль¬татов. Результаты отображаются в виде текстовой сводки или в виде графика.

 

(4) Используйте тестовое приложение из библиотеки Intel AES-NI, см http://software.intel.com/en-us/articles/download-the-intel-aesni-sample-library. Можно включить или отключить AESNI в BIOS в некоторых тестовых проектах, таких как aes_gladman_subset, для демонстрации результатов производительности.

Результаты тестирования

Мы запустили [укажите программу] на планшете с процессором Bay Trail под управлением Android 4.4. Результаты нашего тестирования показали повышение производительности шифрования и расшифровки в 4–11 раз, а также экономию свыше 40 % электроэнергии при использовании Intel AES-NI.

Подробные данные тестирования

  • Результаты выполнения команды openssl speed. на приведенном ниже снимке экрана показан запуск openssl для оценки скорости.


    Рисунок 3. Результаты команды openssl

  • Результаты теста, проведенного с помощью самодельной программы

    Таблица 2. Результаты теста, проведенного с помощью программы, созданной автором

Оборудование: BAYTRAIL_FFRD8 PR1, ОС: ANDROID 4.4
РЕЖИМ
(CBC/256)
Размер файлаIntel® AES-NI включеноIntel® AES-NI отключено
Время (с) без ввода-выводаВремя (с) с вводом-выводомВремя (с) без ввода-выводаВремя (с) с вводом-выводом
Шифрование351M2.8915.414.5925.61
 56M0.482.352.634.55
Расшифровка351M1.7638.14419.7828.51
 56M0.291.93.164.62
  • Без ввода-вывода из приведенной выше таблицы

    Шифрование: повышение производительности почти в 5 раз, аналогично результатам при использовании OPENSSL
    Расшифровка: повышение производительности почти в 11 раз

  • С вводом-выводом из приведенной выше таблицы

    Шифрование: повышение производительности почти в 1,9 раза
    Расшифровка: повышение производительности почти в 2 раза

  • • Результаты теста, проведенного с помощью Intel MPM

    Мы использовали нашу программу в качестве целевого приложения для тестирования и получили следующие результаты:


    Рисунок 4. Результаты теста для AESNI_DISABLED с вводом-выводом (16 с. всего)


    Рисунок 5. Результаты теста для AESNI_ENABLED с вводом-выводом (30 с всего)

    Итоги результатов тестирования с помощью Intel MPM:

    	AESNI_ENABLED: использовано 20 мВт-ч; средняя нагрузка на ЦП 55 %
    	AESNI_DISABLED: использовано 34 мВт-ч; средняя нагрузка на ЦП 52 %

    ПРИМЕЧАНИЕ. За счет включения Intel AES-NI можно сэкономить до 40 % расходуемой электроэнергии по сравнению с программным решением.

Сценарии использования Intel AES-NI

Алгоритм AES широко используется в различных сценариях защиты данных, таких как шифрование при передаче данных в сети, шифрование целых дисков или отдельных файлов. Во всех этих сценариях можно использовать Intel AES-NI при условии поддержки нужных инструкций центральным процессором. На рис. 6 показана типичная передача данных в сети; все данные, передаваемые между пользователями и серверами, шифруются после прохождения проверки подлинности.


Рисунок 6. Типичная передача данных в сети

Еще один типичный сценарий использования — шифрование целых дисков или шифрование отдельных файлов, когда пользователи должны сохранять данные в локальном хранилище. На рис. 7 показан весь рабочий процесс от пользователя до хранилища:


Рисунок 7. Весь рабочий процесс шифрования

Аппаратные инструкции Intel AES-NI обеспечивают и высокую производи-тельность, и экономию электроэнергии, что особенно важно для мобильных устройств, таких как смартфоны и планшеты. Управление мобильными устройствами (MDM) и управление мобильным содержимым (MCM) — крайне важные факторы для корпоративных решений безопасности. В этом разделе описывается Intel AES-NI в сочетании с MDM и MCM.

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


Рисунок 8. Обмен данными MDM с использованием криптографии AES

Пример MCM: пользователи получают доступ к конфиденциальным данным, таким как документы, изображения, видео и т. п., с корпоративных серверов. Такие передаваемые данные нуждаются в надежной защите. Все данные должны быть зашифрованы перед отправкой конечным пользователям; на устройствах пользователей данные должны также храниться в зашифрованном формате. На рис. 9 показан типичный рабочий процесс MCM с начала и до конца при чтении и сохранении данных конечным пользователем. Инструкции Intel AES-NI поддерживают 256-разрядный алгоритм шифрования, поэтому это превосходное аппаратное решение для систем безопасности корпоративного уровня и для выполнения требований конфиденциальности.


Рисунок 9. Рабочий процесс MCM

Для задействования аппаратного ускорения Intel AES-NI разработчикам необхо-димо использовать программирование NDK. На рис. 10 показаны типичные взаимоотношения между уровнями приложений Android, модулем шифрования Android и модулем Intel AES-NI C/C++. Java Native Interface (JNI) используется для связывания функций C/C++ с функциями Java. Если программирование в NDK вам незнакомо, см. справочники по NDK для получения дополнительных сведений.


Рисунок 10. Типичные взаимосвязи между уровнями

Заключение

В этой статье описывается использование инструкций Intel AES-NI для ускорения шифрования на устройствах Android. Показано, каким образом разработчики могут использовать код ассемблера, сторонние библиотеки и Intel NDK для ускорения приложений и экономии электроэнергии. Два типовых сценария шифрования и расшифровки данных описаны для помощи разработчикам в использовании Intel AES-NI в своих приложениях.

Для получения дополнительных сведений о средствах Intel® разработчики Android могут посетить следующие сайты: Intel® Developer Zone for Android.

Об авторах

Чжань Ли (Zhang Li) — инженер по разработке приложений в отделе Intel® Software and Solutions Group (SSG) в подразделении Developer Relations Division в составе группы Mobile Enabling Team. Он занимается поддержкой приложений для Android.

Янчинь Вань (Yanqing Wang) — инженер по разработке приложений в отделе Intel® Software and Solutions Group (SSG) в подразделении Developer Relations Division в составе группы Mobile Enabling Team. В круг его ответственности входит управляемость и безопасность корпоративных решений. Он обладает статусом Intel® Developer Zone (IDZ) Black Belt.

Справочные материалы

[1] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/
[2] http://en.wikipedia.org/wiki/AES_instruction_set
[3] http://software.intel.com/en-us/articles/download-the-intel-aesni-sample-library
[4] http://ark.intel.com/search/advanced/?s=t&AESTech=true
[5] http://www.openssl.org/source/
[6] http://software.intel.com/en-us/articles/intel-power-monitoring-tool-for-android-devices-a-power-and-performance-related-data

Intel, эмблема Intel, Atom, Celeron, Core, Pentium и Xeon являются товарными знаками корпорации Intel в США и в других странах.
*Прочие наименования и товарные знаки могут быть собственностью третьих лиц.
© Intel Corporation, 2014. Все права защищены.

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