Почему моя реализация ElGamal не работает для длинных текстовых строк?

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

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

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

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

4 ответа

Решение

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

Вам нужно использовать положительные числа для ваших операций. Таким образом, вы должны построить 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));

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

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

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

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

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

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

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

Другие вопросы по тегам