AES ускорение для Java

Я хочу зашифровать/дешифровать множество небольших (2-10кБ) фрагментов данных. Производительность в настоящее время в порядке: на Core2Duo я получаю около 90 Мбайт/с AES256 (при использовании 2 потоков). Но мне может понадобиться улучшить это в будущем - или, по крайней мере, уменьшить влияние на процессор.

  • Возможно ли использовать специализированное аппаратное обеспечение AES с Java (с использованием JCE или, возможно, другого API)?
  • Будет ли Java использовать специальные функции процессора (SSE5?!), если я получу лучший процессор?
  • Или есть более быстрые провайдеры JCE? (Я пробовал SunJCE и BouncyCastle - нет большой разницы.)
  • Другие возможности?

Ответы

Ответ 1

JVM сам по себе не использует специальные функции ЦП при выполнении кода, который является AES-шифрованием: распознавание какого-либо кода как реализации AES выходит за рамки возможностей JIT-компилятора. Чтобы использовать специальное оборудование (например, "Padlock" на VIA-процессорах или инструкции AES-NI на новых процессорах Intel), вы должны пойти, в какой-то момент, через "собственный код".

Возможно, поставщик JCE может сделать это для вас. Я не знаю ни одного доступного JCE-провайдера, который включает оптимизированный собственный код для AES (был проект под названием Apache JuiCE, но, похоже, он застопорился, и я не знаю его статуса). Однако вполне возможно, что SunJCE сделает это в будущей версии (но с Oracle, покупающей Sun, и чрезмерной переоценкой OpenJDK 7, неясно, когда будет выпущена следующая версия Java). Альтернативно, кусайте пулю и используйте собственный код самостоятельно. Родительский код вызывается через JNI, а для собственного кода AES популярной реализацией является версия Брайан Гладман. Когда вы получаете более крупный и новый процессор с инструкцией AES-NI, замените этот собственный код кодом, который знает об этих инструкциях, так как Intel описывает.

Используя AES-128 вместо AES-256, вы должны получить + 40% ускорение скорости. Разрушение AES-128 в настоящее время выходит за пределы технологического охвата Человечества и должно оставаться таким же в течение следующих нескольких десятилетий. Вам действительно нужен 256-битный ключ для AES?

Ответ 2

Вы можете воспользоваться улучшенными скоростями AES с помощью поставщика безопасности SunPKCS11 вместе с библиотекой mozilla-nss.

Настройка описана в

Ответ 4

Простой поиск в Google определит некоторых поставщиков JCE, которые утверждают, что аппаратное ускорение Solaris Crypto Framework. Я слышал, что точка безубыточности - 4 КБ (где менее 4 тыс. Быстрее, чем в JVM-провайдерах).

Я мог бы взглянуть на использование NSS, у него могут быть некоторые оптимизации компилятора для вашей платформы (и вы можете, конечно, построить из источник с ними включен); хотя я не использовал его сам. Большим преимуществом аппаратного обеспечения, вероятно, является тот факт, что ключи могут храниться в аппаратном обеспечении таким образом, чтобы поддерживать их, не подвергая их ОС.

Обновление: Я должен, вероятно, упомянуть, что источник Keyczar имел некоторое полезное представление (где-то в источнике или окружающие документы) об уменьшении накладных расходов для инициализации Шифра. Он также делает именно то, что вы хотите (см. Encrypter), и, похоже, реализует асинхронное шифрование (используя пул потоков).

Ответ 5

Я бы также предложил использовать AES-128, а не 256. Если код слабо связан и все еще существует, но многие годы требуется, чтобы AES-128 стал архаичным, я предполагаю, что будет намного проще обновите шифрование в этот момент (когда аппаратное обеспечение будет более мощным), чем сейчас попытаться оптимизировать производительность через аппаратное обеспечение.

Конечно, предполагается, что он слабо связан: D