Детерминированное шифрование RSA в Java - PullRequest
9 голосов
/ 30 марта 2011

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

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

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

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

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

(Примечание. Я работаю с очень маленькими блокамиданных в этом проекте - симметричное шифрование вообще не используется ... Я знаю, что это "интересное" использование RSA!)

Во всяком случае, я обнаружил, что в Java, используя

cipher = Cipher.getInstance("RSA");

использует схему случайного заполнения по умолчанию, стоимость которой составляет 11 байт (поэтому с парой ключей 2048 бит можно зашифровать 2048 / 8-11 = 245 байт).Повторные шифрования одного и того же открытого текста генерируют разные шифротексты, что, очевидно, не является режимом ECB, который мне нужен.

У меня вопрос - мне использовать следующее?

cipher = Cipher.getInstance("RSA/ECB/NoPadding");

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

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

javax.crypto.BadPaddingException: Messageбольше, чем модуль

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

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Удаление набивки делает систему небезопасной.Если публичные ключи действительно являются открытыми, как вы говорите, то злоумышленник может просто перейти к столбцу 5, взять открытые тексты и зашифровать их с помощью 4 открытых ключей в правильной последовательности.Затем они могут сопоставить получившиеся шифротексты с полученными из полученных, компрометируя свойство «без принуждения».

Случайное заполнение останавливает это, потому что злоумышленник не знает, какое дополнение добавить.

Вам нужно будет использовать обычное заполнение, но раскрыть подмножество закрытых ключей для подмножества аудиторов (обычно называемых «проверяющими» в избирательных системах).Это означает, что один проверяющий может подтвердить, что столбец 1 соответствует столбцу 2, другой может подтвердить, что столбец 2 соответствует столбцу 3 и т. Д.Отдельный проверяющий не может сопоставить избирателя с избирательным бюллетенем, только сотрудничающие.


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

1 голос
/ 30 марта 2011

https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Padding

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

0 голосов
/ 31 марта 2011

Так что мне кажется, что у вас есть 2 основных требования, которые вы пытаетесь использовать deterministic RSA для решения:

  1. Разрешение избирателям обеспечить честность их голосования
  2. Разрешение аудиторам обеспечить целостность всех голосов

Цифровые подписи должны решить эту проблему. Вы можете взять свой зашифрованный текст из столбца 1, хэшировать его и зашифровать хеш с помощью частного ключа. Затем этот зашифрованный хэш может быть помещен в столбец 2. Чтобы проверить целостность столбца 1, просто используйте соответствующий открытый ключ, чтобы расшифровать хэш в столбце 2, столбец 1 хеша и сравнить эти 2 значения. Если они равны, данные не были подделаны. Только стороны, которые имеют закрытый ключ, могут вмешиваться в данные в этих столбцах, потому что только они могут создать совпадающую пару. Это похоже на HMAC, но имеет преимущество использования открытых / закрытых ключей, а не секретного общего ключа. Таким образом, любой может проверить, но модифицировать могут только доверенные стороны.

Одна вещь, которую следует отметить в отношении детерминированной схемы, это то, что она будет пропускать информацию разными способами. Давайте предположим, что я знаю, что проголосовал за Blue как мой любимый цвет. Я вижу, что полученный зашифрованный текст моего голосования 0x12345678. Если схема является полностью детерминированной, я знаю, что любой другой, имеющий соответствующий шифротекст 0x12345678, также проголосовал за Blue. Кроме того, поскольку у вас обычно есть ограниченный набор вариантов голосования, выбранная атака открытым текстом невероятно проста. Таким образом, вы действительно хотите позволить RSA выполнять свою работу и использовать предполагаемую схему заполнения.

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

...