Использование Android NDK для шифрования данных, передаваемых из обычного приложения для Android.

Возможно ли и стоит ли пытаться разработать какое-то серверное приложение с использованием Android NDK, которое будет шифровать данные (или просто использовать некоторую встроенную библиотеку шифрования Linux), переданную ему из обычного приложения на основе Java?

Я попытался использовать библиотеку Cipher, но шифрование файла размером 2 МБ с помощью AES заняло почти минуту. И Blowfish недоступен в Cipher до Android 2.3 (?). И я сомневаюсь, что это будет намного быстрее.

Я использовал blowfish для шифрования на Symbian, и это было намного быстрее (менее 5-10 секунд), поэтому я думаю, что в Android это медленнее из-за использования виртуальной машины Java, и я хотел бы попробовать родное приложение для него.

Кто-то делал это раньше?

РЕДАКТИРОВАТЬ: Шифрование в NDK намного быстрее. Сделай это там. Существует аналогичный вопрос с тем же ответом для AES: Расшифровка AES на Android слишком медленная, чтобы ее можно было использовать. Будет ли NDK быстрее? Другие идеи?


person shtolik    schedule 16.02.2011    source источник
comment
Я реализовал довольно много криптографических алгоритмов на Java, и в этом отношении он (намного) медленнее, чем C/C++. Мне не удалось заставить Skein работать быстрее, чем 100 МБ/с на Oracle JVM. Если вы реализуете AES, постарайтесь получить хороший развернутый цикл (например, 8 раундов за одну итерацию) и убедитесь, что ваше приложение не выполняет никаких ненужных копий памяти.   -  person Maarten Bodewes    schedule 28.05.2011
comment
Я также пытаюсь внедрить AES в NDK. Не могли бы вы поделиться тем, что вы сделали? Вы использовали какой-то другой провайдер для AES в своем проекте NDK или вы реализовали свою собственную реализацию?   -  person Raghav Sood    schedule 21.01.2013
comment
Я использую blowfish, а реализация взята из оттуда.   -  person shtolik    schedule 01.02.2013


Ответы (5)


С какой версией Android вы тестируете? Имейте в виду, что, начиная с Froyo, существует JIT-отслеживание, которое должно хорошо работать для математических циклов в криптобиблиотеке.

Для более старых версий вы, вероятно, захотите сделать это с помощью NDK, да. Я не знаю, зачем вам нужен сервер - просто скомпилируйте любую хорошую/быструю криптографическую библиотеку и сделайте обертку вокруг нее с помощью NDK. Затем вы можете просто использовать оболочку из своего приложения на основе Java.

person Delyan    schedule 26.05.2011
comment
Большой разницы между шифрованием на froyo и более старых версиях не было. Но после того, как я реализовал это в NDK, файл размером 1 МБ шифруется примерно за 1 секунду (по сравнению с 30–60 секундами при использовании gnuCrypto java lib). Так что буду считать ваш ответ правильным - делайте это в NDK. - person shtolik; 08.09.2011

BouncyCastle в Android 2.2 работает ужасно медленно с AES/CBC/PKCS5 при использовании расшифровки потока. Процессор загружается на 100%, а пропускная способность составляет 5 КБ/сек.

Использование Chilkat значительно быстрее и снижает использование ЦП (даже в эмуляторе). Но Chilkat не предлагает InputStream для обработки расшифровки потока и буферизует все зашифрованные байты внутри (до тех пор, пока не произойдет ошибка пространства в куче). Таким образом, вы должны сами управлять расшифровкой потока (например, инициализируя chilkat для каждого блока...)

person sabalab    schedule 22.07.2011

Чтобы ответить на ваш вопрос, да, вы, вероятно, могли бы написать что-то, что будет работать с NDK, но я не понимаю, зачем вам это нужно.

Если вы просто хотите зашифровать данные, поступающие в хранилище sql, вы можете проверить SQLCipher ( https://guardianproject.info/code/sqlcipher/ )

Вы также можете попробовать использовать некоторые библиотеки надувных замков ( http://www.bouncycastle.org/java.html). Они могут быть быстрее, чем встроенные в Android, или у них может быть библиотека Blowfish, которую вы можете использовать.

person tahnok    schedule 27.05.2011
comment
Если вы используете библиотеки надувных замков, я считаю, что вам придется немного изменить их, потому что они уже находятся в стеке Android, но не являются общедоступными для разработчика приложений. - person Leif Andersen; 22.07.2011

Это не открытый исходный код, но с точки зрения производительности Chillkat лучшее, что я нашел.

person Kamahire    schedule 02.06.2011

Конечно, для криптографии можно использовать внешнюю библиотеку. Вы можете использовать openssl, например, https://github.com/guardianproject/openssl-android. Единственный вопрос заключается в том, насколько велико будет влияние уровня JNI, существующего между кодом Java и C. Если вам нужно передать много дат на C и обратно, то выгода от наличия собственной библиотеки может быть сведена на нет уровнем JNI. Было бы гораздо лучше перенести больше функциональности с Java на C таким образом, чтобы данные, которые должны быть зашифрованы, могли обрабатываться только на C. Например, сетевой стек и шифрование могут быть на C, а пользовательский интерфейс на Java. Это просто предложение, вам лучше знать, возможно это или нет.

person Zuljin    schedule 02.06.2011