Как добавить алгоритм Bouncycastle для Android

Я пытаюсь написать небольшое приложение, используя алгоритм bouncycastle, из BouncyCastleProvider.java он говорит, что мы должны импортировать и добавить провайдера во время выполнения с помощью следующего кода

import org.bouncycastle.jce.provider.BouncyCastleProvider;Security.addProvider(new BouncyCastleProvider());

ошибка - импорт org.bouncycastle не может быть разрешен; во время ошибки импорта - BouncyCastleProvider не может быть преобразован в тип; при вызове addProvider

Я, хотя Bouncycastle не поставляется с Android 1.6 SDK, поэтому подумал об установке отдельно. как мне это сделать? Если Bouncycastle поставляется вместе с SDK, что я должен сделать, чтобы избежать этих ошибок? Я использую Android 1.6, eclipse-V3.4.0 на winXP . заранее спасибо

5 ответов

Решение

Я не знаком с этой конкретной библиотекой. Однако, вот общие инструкции о том, как включить библиотеку, поставляемую в виде файла 'jar', в проект Android.

Загрузите файл jar и поместите его где-нибудь на свою рабочую станцию. Возможно, вы захотите поместить в корневой каталог проекта, в котором вы его устанавливаете, или, может быть, в каталог 'lib' в корневом каталоге.

В Eclipse выберите "Проект" -> "Свойства", затем выберите "Путь сборки Java". Затем нажмите "Добавить внешние файлы JAR", перейдите к месту, куда вы положили файл.jar, выберите его и нажмите "Открыть".

Теперь введите или вставьте некоторый код, который пытается использовать классы в банке. Если вам повезет, в левом поле появится значок лампочки. Нажав на это, вы предложите добавить правильный оператор импорта в начало вашего файла.java.

Есть еще вещи, которые могут пойти не так в данный момент. Библиотека может использовать контент java. * Или javax. *, Не поставляемый Android (она имеет только подмножество этих библиотек). Также он может иметь дополнительные библиотечные зависимости. Есть и другие причины, по которым.jar может быть несовместим с платформой Android.

Также обратите внимание, что он увеличит размер вашего.apk для размещения нового контента.

В 2021 году ни один из этих ответов не будет отличным.

Ни использование Spongy Castle, ни перекомпиляция BouncyCastle с другим пространством имен пакетов не требуются и не рекомендуются, поскольку конфликты имен пакетов на платформе Android были разрешены в Honeycomb (если вы ВСЕ ЕЩЕ не нацеливаетесь на предсотовые устройства, что чрезвычайно необычно). См. Https://github.com/rtyley/spongycastle/issues/34

Первый шаг - включить необходимые библиотеки в ваш файл gradle. Вы можете получить стандартный BouncyCastle от maven, не нужно загружать и возвращать JAR в свой проект.

При создании с помощью gradle добавьте в свой dependencies раздел в файле проекта Gradle:

      // See https://www.bouncycastle.org/releasenotes.html for latest revision
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.68'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.68'

В зависимости от ваших потребностей вам может не потребоваться фактически добавлять провайдер безопасности Java из официально выпущенного BouncyCastle. Если вы просто хотите использовать классы BouncyCastle напрямую, вы можете сделать это сейчас. Например, я могу написать этот код, который создает объект X500Name без установки поставщика безопасности:

      X500NameBuilder nameBuilder = new X500NameBuilder();
nameBuilder.addRDN(BCStyle.PSEUDONYM, "xyz");
nameBuilder.addRDN(BCStyle.E, "e@example.com");
X500Name name = nameBuilder.build();

С другой стороны, если вы хотите написать код, который использует преимущества BouncyCastle через поставщика безопасности, вам следует сначала заменить встроенный поставщик безопасности Android BouncyCastle на стандартный, поскольку Java не позволяет использовать два поставщика безопасности с одинаковым именем. . Это нужно сделать как можно раньше при запуске приложения:

      import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class MyApplication extends Application {
    static {
        Security.removeProvider("BC");
        // Confirm that positioning this provider at the end works for your needs!
        Security.addProvider(new BouncyCastleProvider());
    }
}

Обратите внимание, что провайдеры безопасности Java сильно полагаются на рефлексию. Если вы используете обфускацию или сжатие вашего проекта, тогда классы BouncyCastle перестанут отбираться или переименовываться ненадлежащим образом, чтобы предотвратить это, вам нужно добавить следующее или подобное proguard.pro файл:

      -keep class org.bouncycastle.jcajce.provider.** { *; }
-keep class org.bouncycastle.jce.provider.** { *; }

Наконец, вы можете написать код, который будет использовать стандартный провайдер безопасности BouncyCastle под капотом:

      // MD2 hash is not secure, just demonstrating...
MessageDigest md = MessageDigest.getInstance("MD2");
byte[] messageDigest = md.digest(byteData);

С MD2 не предоставляется ни одним из встроенных поставщиков безопасности Android, он будет найден, только если вы добавили поставщика безопасности BouncyCastle, как описано выше.

Или лучше использовать SpongyCastle, так как BC, поставляемый с Android, является поврежденным и старым.

Вам не нужно явно добавлять BouncyCastle в качестве поставщика. Как вы говорите, он уже включен в Android.

Вот что я делаю, чтобы получить шифр BouncyCastle AES,

SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");

Если вы заглянете в BouncyCastleProvider.java, то увидите ссылку на PBEWithSHA256And256BitAES-CBC-BC вместе с несколькими другими шифрами, предоставленными BouncyCastle.

Вам нужно будет скомпилировать библиотеку BC под другим именем, так как она будет конфликтовать со встроенной BC уже в Android - перекомпилировать и ссылаться на BC2 или org.BouncyCastle2.x

Другие вопросы по тегам