Детерминированное шифрование RSA в Java

Это мой первый вопрос на этом сайте, и у меня есть только базовые математические представления из RSA, так что, пожалуйста, потерпите меня! :)

Я пишу веб-приложение на Java для своего последнего года в университете. Это веб-реализация "Pret-a-voter", безопасной системы голосования, для тех, кто слышал о ней.

По сути, моя проблема в том, что я хочу дать кому-то, выполняющему роль аудитора:

  • исходный байтовый массив (открытый текст для шифрования)
  • открытый ключ RSA file
  • массив байтов « destination », который является результатом моего собственного вычисления шифрованных данных с учетом открытого текста и открытого ключа

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

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

javax.crypto.BadPaddingException: Сообщение больше, чем модуль

Кто-нибудь знает, почему?

EDIT - шифрование с помощью NoPadding не всегда генерирует это исключение - оно темпераментное. Однако, даже когда шифрование не генерирует это исключение, дешифрование генерирует следующее:

javax.crypto.BadPaddingException: данные должны начинаться с нуля

Большое спасибо за то, что прочитали это! Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ - извините, мой первоначальный вопрос был не таким. Мне очень ясно, что я хочу сделать, поэтому вот [попытка] объяснения:

  • Открытый текст - это голос избирателя на выборах.
  • Pret-a-voter стремится быть сквозным. конец поддается проверке без ущерба для конфиденциальности избирателей (и т. д.). После голосования избирателю выдается квитанция, которую он может использовать, чтобы убедиться, что его голос записан правильно, и которая позже покажет ему, что его голос не был подделан. Избиратель сравнивает полученную информацию с идентичной копией, размещенной в Интернете.
  • Однако ни один избиратель не должен иметь возможности доказать, как он / она проголосовал (так как это может привести к принуждению), поэтому информация - это не открытый текст, а зашифрованная копия голосования.
  • Фактически, открытый текст зашифрован четыре раза, с четырьмя разными асимметричными ключами, которые держат два разных кассира, у каждого по два ключа. Таким образом, голосование (открытый текст) предоставляется одному кассиру, который шифрует его с помощью открытого ключа # 1, а затем шифрует ЭТО зашифрованный текст своим вторым открытым ключом, передает ЭТО зашифрованный текст второму кассиру, который шифрует его двумя своими ключами одним и тем же путь. Полученный зашифрованный текст (результат четырех последовательных шифрований) - это то, что публикуется в сети (становится общедоступным). Счетчикам доверяют.
  • Каждый зашифрованный голос можно представить себе как «луковицу», где в центре находится голос и есть несколько уровней шифрования. Чтобы попасть на голосование, каждый уровень должен быть удален по очереди, что означает, что соответствующие закрытые ключи (хранящиеся у кассиров) должны применяться в обратной последовательности. Это ключ к безопасности - все счетчики должны работать сообща, чтобы расшифровать голоса.
  • Электронную доску объявлений можно представить в виде таблицы с 5 столбцами - первый (слева) содержит полностью зашифрованные голоса ( также отображается в квитанции каждого избирателя), и является единственной видимой колонкой на этапе голосования. Второй столбец содержит тот же набор голосов, но с удаленным внешним слоем - кассир 2 заполняет этот столбец и столбец 3, расшифровывая голоса с помощью своих закрытых ключей на этапе подсчета голосов. В конце этапа подсчета столбец 5 содержит полностью расшифрованные голоса, которые затем могут быть подсчитаны.
  • Каждый избиратель получает квитанцию, которая связывает их с зашифрованным голосом в столбце 1. Это не показывает, как они проголосовали. но позволяет им убедиться, что их голос не был изменен, поскольку на протяжении всего процесса выборов они могут убедиться, что их зашифрованный голос все еще находится в столбце 1, нетронутым. Это, конечно, только половина «сквозной проверки», поскольку избиратели не могут проверить, что дешифрование было выполнено правильно, то есть что в столбце 2 есть запись, которая представляет собой их голос за вычетом внешнего уровня шифрования. . Каждый избиратель несет ответственность только за проверку ДО пункта, указанного в столбце 1.
  • После этого аудиторы обязаны проверить, что записи в столбце 1 расшифровываются до столбца 2 и так далее. Они делают это, полагаясь на детерминированное шифрование, и открытые ключи, используемые для шифрования, являются общедоступными.
  • Поскольку открытые ключи являются общедоступными, вы не должны ' Я не хочу, чтобы люди просто рисовали линии из столбца 5 в столбец 1, присоединяя чей-то голос, поскольку он многократно зашифровывается - таким образом квитанция, которая связывает вас с зашифрованным голосованием, фактически привязывает вас к незашифрованному, читаемому голосованию -> принуждение! Таким образом, только столбцы 1, 3 и 5 являются общедоступными (поэтому каждый кассир выполняет ДВА шифрования), а для каждой записи в столбце 3 аудиторам раскрывается только ОДНА из соответствующих записей в {2,4}. Это не позволяет кому-либо (даже аудиторам) связать зашифрованный голос с незашифрованным.
  • Таким образом, аудиторам необходимо взять запись в столбце 3, получить соответствующую запись в столбце 2 и открытый ключ и выполнить такое же шифрование для убедитесь, что они действительно получают запись в столбце 2.
  • В совокупности это обеспечивает возможность сквозной проверки.

Извините, это было так долго - я надеюсь, что это описывает мою потребность в детерминированном шифровании. Я упустил много фундаментальных деталей (я сильно изменил эту схему), но, надеюсь, все основные принципы присутствуют. Большое спасибо за чтение - я очень ценю это.

9
задан Chris 30 March 2011 в 22:10
поделиться