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

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

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

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

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

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

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

в любом случае я нашел это в Java, используя

cipher = Cipher.getInstance("RSA");

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

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

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

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

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

javax.криптографический.BadPaddingException: сообщение больше, чем модуль

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

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

javax.криптографический.BadPaddingException: данные должны начинаться с нуля

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

EDIT-извините, мой первоначальный вопрос не был очень ясен о том, что я хочу сделать ,поэтому вот [попытка] объяснение:

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

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

3 ответов


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

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

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


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


https://en.wikipedia.org/wiki/RSA_ (криптосистема) # Padding

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


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

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

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

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

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