Ответ 1
Это сложно, но я постараюсь объяснить, насколько это возможно. Думаю, я начну с Java. Мое обсуждение ориентировано на Java 6, я не уверен, что изменилось в Java 7.
Встроенная криптография Java доступна через расширение Java Cryptography Extension (JCE). Это расширение имеет две части: API приложения и API поставщика услуг. API приложения - это часть, с которой вы взаимодействуете. Вы используете методы getInstance()
factory для различных криптографических классов. Аспект поставщика услуг более запутанный для среднего программиста. Они не заботятся о том, как криптография реализована, они просто хотят что-то, что работает. Но под капотом есть классы криптопровайдера, которые выполняют фактическую работу. Если вы посмотрите на аргументы getInstance()
, вы увидите, что вы можете указать поставщика, если хотите. Зачем вам когда-нибудь захотеть? Возможно, вы заплатили $$$ за оптимизированную коммерческую реализацию RSA, поэтому вы хотите использовать ее. Возможно, у одного провайдера есть сертификат FIPS или какой-либо другой сертификат, который вам нужен для вашего приложения. Затем вы должны указать этого провайдера. Sun/Oracle отправляет свою среду Java с несколькими поставщиками, которые вместе составляют набор поставщиков по умолчанию для своей среды Java. Не смотрите на них слишком тщательно, потому что они накладываются друг на друга и, таким образом, запутываются из-за исторических артефактов. В основном, когда вы используете Oracle Java, вы запрашиваете некоторый криптоподобие, как KeyPairGenerator
через KeyPairGenerator.getInstance("RSA");
, вы получите соответствующий экземпляр класса от одного из этих поставщиков.
Далее, давайте посмотрим на bouncycastle. Библиотека bouncycastle состоит из двух частей. Одна из них - их уникальная крипто-библиотека, API которой вы экспериментировали в своем # 2 выше. Вторая часть - это много кода клея, позволяющего использовать эту библиотеку в качестве поставщика шифрования для JCE. Это означает, что у вас, как у программиста, есть выбор в том, как вы используете библиотеку криптовальной системы bouncycastle. Вы можете использовать их API напрямую, как в № 2 выше. Или вы можете использовать JCE api, но явно указывать реализацию bouncycastle чем-то вроде KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
.
Если вы предпочитаете использовать уникальный API-интерфейс bouncycastle напрямую (они называют его своим "легким API" ), тогда вам не нужен весь код клея, используемый для работы в качестве поставщика JCE. Для этого bouncycastle действительно обеспечивает загрузку только легких классов API.
И теперь, наконец, мы смотрим на реализацию Android. Google не лицензировал исходный код Oracle Java, поэтому у них не было ни одного поставщика Oracle JCE. Они должны были предоставить своих поставщиков. Поскольку у bouncycastle был весь необходимый код, он был с открытым исходным кодом и лицензированно лицензирован, Google/Android решил использовать bouncycastle в качестве основы для своего поставщика JCE по умолчанию. Но Android не прилагает никаких усилий, чтобы сделать доступным уникальный легкий API для Android-программистов. Они ожидают, что вы будете использовать эти классы исключительно через JCE. Они изменили код bouncycastle, чтобы настроить его для Android. Они факт, что вы можете найти и, возможно, использовать некоторые из легких API непосредственно на Android, просто побочный эффект от того, что он находится под капотом. И не все. Некоторые из них описали эту ситуацию, поскольку "bouncycastle на Android искалечен".
Чтобы на самом деле предоставить полнофункциональную версию библиотеки bouncycastle на Android, некоторые разработчики создали нечто, называемое библиотекой Spongycastle. Это не что иное, как библиотека bouncycastle, модифицированная так, чтобы она могла работать на Android. Главной модификацией было изменение имен пакетов от org.bouncycastle.*
до org.spongycastle.*
для предотвращения конфликтов пространства имен.
Итак, что вы должны использовать? Это зависит от того, что вы хотите делать, каковы ваши потребности в переносимости, каковы ваши предпочтения в стиле, и каков ваш уровень криптографии. В общем, когда вы используете эти библиотеки, вы используете криптографию на довольно низком уровне. Вы концентрируетесь на том, как это сделать (используйте RSA для транспортировки ключей, используйте AES для шифрования сообщений, используйте HMAC-SHA256 для целостности сообщений и т.д.) В сравнении с тем, что делать (я хочу отправить зашифрованное сообщение получателю по электронной почте подобный механизм). Очевидно, что если вы можете придерживаться библиотек более высокого уровня, которые непосредственно решают вашу проблему. Эти библиотеки уже понимают, что такое PKCS # 1 и как использовать его как часть более крупных и более полных протоколов.