Кристофер Берд (Christopher Bird), инженер по программному обеспечению
Источник приложений: Intel SSG
Введение
Шифрование весьма важно, поскольку оно позволяет безопасно защитить конфиденциальные данные. В сообществе безопасности шифрованию уделяется много внимания. На мобильных устройствах хранится все больше важной информации, поэтому ценность шифрования как способа защиты информации постоянно возрастает.
В этой статье описываются API-шифрования данных, доступные в Java* или OpenSSL*. Оба решения работают под управлением Android.
Мы рекомендуем пробовать описываемые возможности и компилировать код по мере чтения этой статьи.
Код шифрования данных
Если нужно зашифровать данные в Android, у вас два варианта: API Java Crypto и API OpenSSL. Мы рассмотрим шифрование данных обоими способами.
API Java Crypto
Использовать API Java Crypto в Android очень просто. Сначала нужно создать ключ для шифрования. Для этого используется класс KeyGenerator в пакете javax.crypto.
mKey = null; try { kgen = KeyGenerator.getInstance("AES"); mKey = kgen.generateKey(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }
Полученный ключ можно использовать для шифрования файла данных. Для этого нужно подавать сегменты байтов функции AES Cipher, созданной пакетом javax.crypto.
// open stream to read origFilepath. We are going to save encrypted contents to outfile InputStream fis = new FileInputStream(origFilepath); File outfile = new File(encFilepath); int read = 0; if (!outfile.exists()) outfile.createNewFile(); FileOutputStream encfos = new FileOutputStream(outfile); // Create Cipher using "AES" provider Cipher encipher = Cipher.getInstance("AES"); encipher.init(Cipher.ENCRYPT_MODE, mKey); CipherOutputStream cos = new CipherOutputStream(encfos, encipher); // capture time it takes to encrypt file start = System.nanoTime(); Log.d(TAG, String.valueOf(start)); byte[] block = new byte[mBlocksize]; while ((read = fis.read(block,0,mBlocksize)) != -1) { cos.write(block,0, read); } cos.close(); stop = System.nanoTime(); Log.d(TAG, String.valueOf(stop)); seconds = (stop - start) / 1000000;// for milliseconds Log.d(TAG, String.valueOf(seconds)); fis.close();
OpenSSL API
Для шифрования данных с помощью OpenSSL в Android нужно написать собственный код C, доступ к которому в Java осуществляется с помощью вызовов JNI. Здесь требуется больше работы, но и производительность будет выше.
Сначала нужно создать ключ и вектор инициализации (ВИ).
unsigned char cKeyBuffer[KEYSIZE/sizeof(unsigned char)]; unsigned char iv[] = "01234567890123456"; int opensslIsSeeded = 0; if (!opensslIsSeeded) { if (!RAND_load_file("/dev/urandom", seedbytes)) { return -1; } opensslIsSeeded = 1; } if (!RAND_bytes((unsigned char *)cKeyBuffer, KEYSIZE )) { }
Затем можно использовать полученный ключ (cKeyBuffer) для шифрования файла. Инициализируйте EVP, предоставив ключ и ВИ. Затем подавайте сегменты байтов функции EVP_EncryptUpdate. Последний сегмент байтов файла нужно подать функции EVP_EncryptFinal_ex.
if (!(EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, cKeyBuffer, iv ))) { ret = -1; printf( "ERROR: EVP_ENCRYPTINIT_EXn"); } // go through file, and encrypt if ( orig_file != NULL ) { origData = new unsigned char[aes_blocksize]; encData = new unsigned char[aes_blocksize+EVP_CIPHER_CTX_block_size(e_ctx)]; // potential for encryption to be 16 bytes longer than original printf( "Encoding file: %sn", filename); bytesread = fread(origData, 1, aes_blocksize, orig_file); // read bytes from file, then send to cipher while ( bytesread ) { if (!(EVP_EncryptUpdate(e_ctx, encData, &len, origData, bytesread))) { ret = -1; printf( "ERROR: EVP_ENCRYPTUPDATEn"); } encData_len = len; fwrite(encData, 1, encData_len, enc_file ); // read more bytes bytesread = fread(origData, 1, aes_blocksize, orig_file); } // last step encryption if (!(EVP_EncryptFinal_ex(e_ctx, encData, &len))) { ret = -1; printf( "ERROR: EVP_ENCRYPTFINAL_EXn"); } encData_len = len; fwrite(encData, 1, encData_len, enc_file ); // free cipher EVP_CIPHER_CTX_free(e_ctx);
Заключение
Работая с примерами кода, представленными в этом документе, вы можете быстро узнать, как использовать API Java Crypto и OpenSSL для шифрования данных на платформах с процессором Intel®под управлением Android.
Обавторе
Кристофер Берд (Christopher Bird) — сотрудник отдела Intel Software and Solutions Group (SSG), подразделения Developer Relations Division в составе группы Intel® Atom™ Processor Mobile Enabling Team.
Другие статьи и ресурсы по этой теме:
Примечания
ИНФОРМАЦИЯ В ДАННОМ ДОКУМЕНТЕ ПРИВЕДЕНА ТОЛЬКО В ОТНОШЕНИИ ПРОДУКТОВ 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 в США и в других странах.
© Intel Corporation, 2014. Все права защищены.
* Прочие наименования и товарные знаки могут быть собственностью третьих лиц.