Моей команде необходимо разработать решение для шифрования двоичных данных (хранящихся как byte[]
) в контексте приложения Android, написанного на Java. Зашифрованные данные будут передаваться и храниться различными способами, при этом не исключено повреждение данных. В конце концов другое приложение Android (опять же написанное на Java) должно будет расшифровать данные.
Уже решено, что алгоритм шифрования должен быть AES с ключом 256 бит. Однако я хотел бы принять осознанное решение о том, какую реализацию AES и / или «режим» мы должны использовать. Я читал о том, что называется режимом GCM, и мы провели с ним несколько тестов (с использованием BouncyCastle / SpongyCastle), но мне не совсем понятно, для чего именно AES-GCM и что он «покупает» нас по сравнению с обычным AES - и нужно ли учитывать какие-либо компромиссы.
Вот список проблем / требований / вопросов, которые у нас есть:
Заполнение: данные, которые нам нужно зашифровать, не всегда будут кратны 128 битам, поэтому реализация / режим AES должны добавлять заполнение, но только при необходимости. У меня создалось впечатление, что простая реализация AES, такая как предоставленная
javax.crypto.Cipher
, этого не сделает, но первоначальные тесты показали, что это так. Поэтому я предполагаю, что требование заполнения само по себе не является причиной прибегать к чему-то вроде GCM вместо "простого" AES. Это верно?Аутентификация. Нам нужен надежный способ определения повреждения данных. Однако в идеале мы также хотим обнаруживать попытки дешифрования с неправильным ключом. Следовательно, мы хотим иметь возможность различать оба этих случая. Причина, по которой я в конечном итоге рассмотрел GCM, была связана с этим вопросом о стеке, где один из респондентов, похоже, подразумевает что сделать это различие возможно с помощью AES-GCM, хотя он не дает подробного объяснения (не говоря уже о коде).
Минимизация накладных расходов. Нам необходимо ограничить накладные расходы на хранение и передачу зашифрованных данных. Поэтому мы хотим знать, влияет ли выбор конкретной реализации / режима AES на количество накладных расходов и в какой степени.
Производительность шифрования / дешифрования. Хотя это не является основной проблемой, мы задаемся вопросом, в какой степени выбор конкретной реализации / режима AES влияет на производительность шифрования и дешифрования как с точки зрения времени процессора, так и объема памяти.
Заранее благодарим за любые советы, разъяснения и / или примеры кода.
РЕДАКТИРОВАТЬ: Делнан услужливо указал, что не существует такой вещи, как "простой AES". Чтобы прояснить, я имел в виду использование встроенной в Java поддержки AES.
Вот так: Cipher localCipher = Cipher.getInstance("AES");