Шифрование RSA в Java: кроссплатформенные проблемы? - PullRequest
10 голосов
/ 07 февраля 2011

Ситуация

Я работаю с шифрованием RSA в Java.Я пытаюсь зашифровать данные на телефоне разработчика HTC Saphire (32B), оснащенном Android 2.2 от Cyanogenmod, а затем расшифровываю данные на 64-битном сервере под управлением Mandriva Linux 2010. Я использую одну и ту же пару открытого ключа, секретного ключа на обеих машинах., может правильно шифровать / дешифровать данные на телефоне Android, может правильно шифровать / дешифровать данные на сервере Linux, но я не могу зашифровать данные на телефоне, а затем расшифровать их на сервере.Я получаю плохие исключения.Я подтвердил, что данные правильно отправляются по телефону и правильно анализируются сервером.Поэтому я не могу понять, почему расшифровка не удалась.Кто-нибудь может мне с этим помочь?Возможно, алгоритм RSA в Java имеет некоторое предположение о размере слова?

Дополнительная информация:

  • Моя библиотека шифрования / дешифрования основана на найденном руководстве здесь.
  • Мой ключ шифрования имеет длину 2048 бит, но я вижу похожее поведение с ключами разных размеров.
  • Я упаковал свой код шифрования / дешифрования RSA в банкуфайл.Он был скомпилирован с помощью Eclipse на компьютере сервера.
  • Программа, использующая библиотеку шифрования на телефоне Android, использует вышеуказанную библиотеку.Он также был построен с использованием Eclipse.
  • Серверная программа была построена с использованием Netbeans (как это было проще в то время).

Другие вопросы

  • Существуют ли другие бесплатные алгоритмы / библиотеки шифрования с открытым ключом для Java?Они работают кроссплатформенно?Какую производительность можно ожидать от них?И т. Д. И т. Д. Я изучил это и не нашел много;возможно я смотрю с неправильными ключевыми словами.

Фу!Я думаю это все.Заранее спасибо за помощь!

Ответы [ 2 ]

12 голосов
/ 07 февраля 2011

RSA-шифрование (или любой другой алгоритм шифрования) должно работать независимо от среды.Однако, возможно, что некоторые системы делают разные предположения о заполнении по умолчанию и режиме работы.Убедитесь, что при выполнении шифрования и дешифрования вы полностью указываете не только алгоритм, но и режим работы (CBC и т. Д.) И заполнение.Если это не сработает, я предлагаю опубликовать ваш код как с устройства, так и с сервера, чтобы мы могли более внимательно изучить его.

Изменить Чтобы ответить на ваш вопрос, в Java, когда выполучить шифр из пакета crypto, вы обычно делаете это с помощью следующего кода:

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

Строка, предоставленная getInstance, инструктирует среду выполнения получить экземпляр шифра, который будет использовать алгоритм AES, шифррежим работы цепочки блоков и отступы PKCS5.Существует ряд поддерживаемых алгоритмов и отступов.Я бы проверил этот документ из Oracle для получения дополнительной информации о шифровании в Java.

Точнее, строка, которую вы используете для запроса шифра, имеет формат

<algorithm>/<mode of operation>/<padding>

Что еще хуже, несмотря на то, что Java предоставляет ряд алгоритмов, режимов работы и отступов, не все из них будут работать вместе.Вам нужно будет прочитать документацию, чтобы найти строку конфигурации, которая будет работать.

0 голосов
/ 07 февраля 2011

Возможно, вам следует выполнить контрольную сумму данных и убедиться, что это именно то, что вы хотите передать в API шифрования / дешифрования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...