Почему моя реализация 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));
Если вы хотите зашифровать определенные данные с помощью асимметричного криптографического алгоритма, вы можете сделать это только для действительно короткого блока данных. Причины бывают как "технические" (алгоритм работает таким образом), так и "практические" (асимметричная криптография медленная).
Правильный способ шифрования большого блока данных с использованием асимметричного криптографического алгоритма
- генерировать случайный ("сессионный") ключ для некоторого симметричного алгоритма (AES, RC4, 3DES, вы называете его).
- использовать этот алгоритм для шифрования данных
- используйте свой асимметричный алгоритм для шифрования ключа сеанса
- хранить зашифрованный ключ рядом с данными.
- перестань изобретать велосипед
Ты можешь попробовать
BigInteger pText = new BigInteger(plaintext.getBytes("UTF-8"));
чтобы сделать кодирование / декодирование и шифрование / дешифрование более симметричным, но я не уверен, является ли это основной причиной.
Кстати, вы никогда не должны молча потреблять Exception
, Самое меньшее, что вы можете сделать, это просто catch (UnsupportedEncodingException e)
,