Реализация RSA для Java, альтернатива BC - PullRequest
1 голос
/ 24 мая 2010

Реализация RSA, поставляемая с Bouncy Castle, позволяет шифровать только один блок данных.Алгоритм RSA не подходит для потоковой передачи данных и не должен использоваться таким образом.В такой ситуации вы должны зашифровать данные с использованием случайно сгенерированного ключа и симметричного шифра, после чего вы должны зашифровать случайно сгенерированный ключ с помощью RSA, а затем отправить зашифрованные данные и зашифрованный случайный ключ на другой конец, где они могутполностью изменить процесс (т. е. расшифровать случайный ключ, используя закрытый ключ RSA, а затем расшифровать данные).

Я не могу использовать обходной путь использования симметричного ключа.Итак, есть ли другие реализации RSA, кроме Bouncy Castle?

Ответы [ 4 ]

5 голосов
/ 24 мая 2010

Это ограничение не просто случайно изобретено Bouncy Castle, и использование симметричного ключа не является "обходным путем": это правильная практика.

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

Я бы просто придерживался стандартной практики потоковой передачис симметричным шифрованием и шифрованием симметричного ключа (и, по сути, ничего другого) с помощью RSA.

1 голос
/ 24 мая 2010

Вы можете вызывать RSA один раз для каждого «блока» данных.Не делайте этого.

  • RSA не является блочным шифром.Он принимает входные данные в диапазоне [0, p × q], а не [0,2 n -1].В очевидной реализации каждый выходной блок по меньшей мере на 1 бит больше, чем входной блок, что не является идеальным.
  • RSA является мультипликативным.Использование RSA e () означает шифрование RSA с ключом e,
    • RSA e (0) = 0
    • RSA e (1) = 1
    • RSA e (a * b) = RSA e (a) × RSA e (a)

Почему вы не можете сгенерировать симметричный ключ?

1 голос
/ 24 мая 2010

Все реализации RSA будут иметь одинаковое предупреждение. Такова природа алгоритма RSA.

Использование симметричного ключа, как описано, не является «обходным путем». Это правильно." Если есть какая-либо возможность применить лучшую технику шифрования, это стоит того.

1 голос
/ 24 мая 2010

Да, JDK поставляется с одним, но это не принесет вам пользы.Как правило, это способ шифрования при использовании RSA.Вы генерируете случайный симметричный ключ и шифруете свои данные этим.Вы шифруете симметричный ключ с помощью RSA и передаете.

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

...