Использование Android NDK для шифрования данных, передаваемых из обычного приложения для Android - PullRequest
8 голосов
/ 16 февраля 2011

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 22 июля 2011

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

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

1 голос
/ 28 мая 2011

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

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

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

1 голос
/ 26 мая 2011

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

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

0 голосов
/ 02 июня 2011

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

0 голосов
/ 02 июня 2011

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

...