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