Почему моя реализация ElGamal не работает для длинных текстовых строк? - PullRequest
1 голос
/ 15 мая 2010

Я играю с криптосистемой Эль-Гамаль, и моя цель - иметь возможность шифровать и дешифровать длинные последовательности текста.

Эль-Гамаль требует, чтобы открытый текст был целым числом. Я превратил свою строку в byte [], используя метод .getBytes () для Strings, а затем создал BigInteger из байта []. После шифрования / дешифрования я превращаю BigInteger в byte [], используя метод .toByteArray () для BigIntegers, а затем создаю новый объект String из байта [].

Я использую 1035-битный ключ, и это прекрасно работает, когда я шифрую / дешифрую со строками длиной до 129 символов. При использовании 130 или более символов вывод, полученный с помощью моего метода расшифровки, искажается.

Может кто-нибудь подсказать, как решить эту проблему?

Ответы [ 4 ]

6 голосов
/ 15 мая 2010

Как и в RSA, вы не можете зашифровать значение, большее, чем модуль в ElGamal.

0 голосов
/ 15 мая 2010

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

Правильный способ шифрования большого блока данных с использованием асимметричного криптографического алгоритма -

  1. генерировать случайный ("сессионный") ключ для некоторого симметричного алгоритма (AES, RC4, 3DES, вы называете его).
  2. использовать этот алгоритм для шифрования данных
  3. использовать ваш асимметричный алгоритм для шифрования сеансового ключа
  4. хранить зашифрованный ключ рядом с данными.
  5. перестань изобретать велосипед
0 голосов
/ 15 мая 2010

Вам нужно использовать положительные числа для ваших операций. Так что вы должны построить BigInteger следующим образом:

BigInteger pText = new BigInteger(1, plaintext.getBytes());
// 1: select a random integer k such that 1 <= k <= p-2
BigInteger k = abs(new BigInteger(p.bitLength() - 2, sr));
0 голосов
/ 15 мая 2010

Вы можете попробовать

BigInteger pText = new BigInteger(plaintext.getBytes("UTF-8"));

, чтобы сделать кодирование / декодирование и шифрование / дешифрование более симметричными, но я не уверен, является ли это основной причиной.

Кстати, вы никогда не должны молча потреблять Exception. Самое меньшее, что вы можете сделать, это просто catch (UnsupportedEncodingException e).

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