Шифрування та розшифровка
У цьому блозі перераховуються дії з інтеграції інструкцій Intel AES-NI до Android за допомогою бібліотеки OpenSSL. Виконавши наведену тут інструкцію, ви зможете створити програму JNI, яка використовує прискорення AES-NI.
Нові інструкції шифрування стандарту AES (Intel AES-NI)
Використання Intel AES-NI в Android
Алгоритми AES у складі бібліотеки OpenSSL продемонстрували значно вищу продуктивність порівняно з нативними алгоритмами Java. Причина в тому, що бібліотека оптимізована для процесорів Intel і використовує інструкції AES-NI. Нижче наведено покроковий опис шифрування файлу за допомогою провайдера OpenSSL.
Починаючи з Android 4.3, в OpenSSL AOSP присутня підтримка Intel AES-NI, тому вам достатньо скомпілювати код з потрібною конфігурацією. Також можна завантажити його з офіційного веб-сайту та скомпілювати самостійно, а потім використовувати файл *.a/*.so безпосередньо у вашому проекті. Отримати бібліотеки шифрування можна двома способами.
Якщо у вас немає коду AOSP, можна завантажити OpenSSL тут. Використовуйте останню версію, щоб уникнути всіх відомих уразливостей, виявлених у попередніх версіях OpenSSL. AOSP включає інтегровану бібліотеку openssl, яку можна помістити в папку jni додатки для доступу до папок, що входять до її складу. Якщо ви завантажуєте вихідний код openssl для самостійної компіляції та створення бібліотеки, використовуйте таке. 1. Завантажте вихідний код:
2. Компілюйте: виконайте наступну команду в консолі (зверніть увагу, що потрібно задати для змінної NDK повний шлях до вашого дистрибутива):
Після цього файл libcrypto.a з'явиться у верхній папці. Щоб використовувати файл *.so, введіть Configureshared android-x86***. За наявності вихідного коду AOSP ланцюжок інструментів ndk не потрібний.
При цьому libcrypto.a компілюється та розміщується в каталогі out/host/linux_x86/bin. Використовуйте OpenSSL через NDK у проекті Android Створіть проект Android для шифрування файлів у вашому улюбленому середовищі розробки. Тут розглядається приклад із Eclipse.
- Оголосіть функції, пов'язані з OpenSSL, як native function у файлі Android.mk.
- Створіть папку jni у оригінальному проекті Android.
- Створіть заздалегідь скомпіловані папки include всередині папки jni.
- Увімкніть папку бібліотеки OpenSSL, створену в папку jni.
- Потім реалізуйте шифрування, написавши функцію C jni/*.c. Після цього потрібно скопіювати файли *.a/*.so та файл заголовка в проект.
- Завантажте бібліотеку та реалізацію на C у папку jni, у функції класу android, створеного на кроці 1 у вигляді системної бібліотеки.
Створіть новий проект в Eclipse, наприклад EncryptFileOpenSSL. Або за допомогою eclipse (клацніть правою кнопкою миші ім'я проекту в браузері проектів), або за допомогою терміналу створіть папку jni, а всередині неї дві вкладені папки: pre-compiled і include. За допомогою терміналу:
Потім додайте наступний рядок у файл jni/Android.mk:
Потім можна використовувати функції, надані OpenSSL, для реалізації ваших функцій encrypt/decrypt/SSL. Для використання Intel AES-NI використовуйте функцію серії EVP_*, як показано нижче. При цьому апаратний модуль Intel AES-NI буде автоматично задіяний для шифрування та розшифрування AES, якщо ЦП підтримує це. Наприклад, при створенні класу для шифрування файлів за допомогоюпровайдера OpenSSL функція шифрування в класі *.java буде виглядати так (цей вихідний код взятий з блогу Крістофера Берда під назвою Зразок коду: програма для шифрування даних).
Функція шифрування у файлі encodeFile.cpp, який ми завантажили за допомогою System.loadLibrary, буде такою:
Потім використовуємо ndk-build для компіляції ./
/ndk-build APP_ABI=x86 Скопіюйте папку/
/include/openssl всередину папки
/jni/. Файли *.so/*.a повинні знаходитися в/
/libs/armeabi/. Файл encode.cpp, який використовується для шифрування та розшифровки, повинен знаходитися в папці
Аналіз продуктивності
Наступні функції дозволяють проаналізувати використання ЦП, використання пам'яті та час, витрачений на шифрування повідомлення. Цей вихідний код також взятий із блогу Крістофера Берда.
Використання ЦП
Нижче наведений код допомагає прочитати дані про середнє навантаження на ЦП, що зберігаються в /proc/stat.
Використання пам'яті
Нижче наведений фрагмент коду зчитує доступний обсяг системної пам'яті. Memory Info - це API Android, що дозволяє отримувати інформацію про доступну пам'ять. Отже, 1024 байти = 1 КБ, а 1024 КБ = 1 МБ. Тому, щоб перетворити доступну пам'ять на мегабайти: 1024*1024 == 1048576
Додаткові відомості про оптимізацію компіляторів див. у нашому повідомленні про оптимізацію.
Ви можете допомогти і перевести небагато коштів на розвиток сайту